GVKun编程网logo

Java转JSON串的几种方式(java 转 json)

1

如果您想了解Java转JSON串的几种方式的相关知识,那么本文是一篇不可错过的文章,我们将对java转json进行全面详尽的解释,并且为您提供关于Gson中@JsonAdater注解的几种方式总结、j

如果您想了解Java转JSON串的几种方式的相关知识,那么本文是一篇不可错过的文章,我们将对java 转 json进行全面详尽的解释,并且为您提供关于Gson中@JsonAdater注解的几种方式总结、jackson java转json hibernate懒加载造成的无限递归问题、Java - 格式化输出JSON字符串的两种方式、java ajax返回 Json 的 几种方式的有价值的信息。

本文目录一览:

Java转JSON串的几种方式(java 转 json)

Java转JSON串的几种方式(java 转 json)

昨天在与对端系统调接口的时候,对端系统对我们传过去的json串老是处理不了,后来查原因是应为我们传

昨天在与对端系统调接口的时候,对端系统对我们传过去的json串老是处理不了,后来查原因是应为我们传过去的json串里有json对象数组,因为我们的json串存在表里的,取出来是作为json字符串放到json数组里的,所以带了双引号,对端认为是字符串,不是json对象所以处理不了。

[{"cardName":"bankCard1","cardCode":"888888888","cardValue":99999999},{"cardName":"bankCard2","cardCode":"999999999","cardValue":222222222}] 这种是正确的json对象数组,["{"cardName":"bankCard1","cardCode":"888888888","cardValue":99999999}","{"cardName":"bankCard2","cardCode":"999999999","cardValue":222222222}"],这种是json字符串数组。

以下总结一下java转JSON串的几种方式:

1、将java对象转成json串

2、通过JSONObject生成json串

3、通过json字符串生成json串

代码通过阿里的fastjson包实现。

代码如下:

1、Person类,包含Crad的List

package com.doit8.test.jsontest.pojo; import java.util.ArrayList; import java.util.List; public class Person { private String username; private String email; private String sex; private int age; private List cardList=new ArrayList(); public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public List getCardList() { return cardList; } public void setCardList(List cardList) { this.cardList = cardList; } }

2、Card类

package com.doit8.test.jsontest.pojo; public class Card { private String cardName; private String cardCode; private Integer cardValue; public String getCardName() { return cardName; } public void setCardName(String cardName) { this.cardName = cardName; } public String getCardCode() { return cardCode; } public void setCardCode(String cardCode) { this.cardCode = cardCode; } public Integer getCardValue() { return cardValue; } public void setCardValue(Integer cardValue) { this.cardValue = cardValue; } }

3、JSON处理测试类

package com.doit8.test.jsontest; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.doit8.test.jsontest.pojo.Card; import com.doit8.test.jsontest.pojo.Person; /** * JSON转换 * */ public class App { public static void main( String[] args ) { //1。通过对象生成JSON串,对象里包含对象数组转成JSON串。 Person person=new Person(); person.setUsername("xiejava"); person.setSex("man"); person.setAge(38); person.setEmail("xiejava@ishareread.com"); Card card1=new Card(); card1.setCardName("bankCard1"); card1.setCardCode("888888888"); card1.setCardValue(99999999); Card card2=new Card(); card2.setCardName("bankCard1"); card2.setCardCode("999999999"); card2.setCardValue(222222222); //对象数组 List cards=new ArrayList(); cards.add(card1); cards.add(card2); person.setCardList(cards); String json = JSON.toJSON(person).toString(); System.out.println(json); //2.通过JSON对象生成JSON串 JSONObject jObject=new JSONObject(); jObject.put("username", "xiejava"); jObject.put("sex", "man"); jObject.put("age", 38); jObject.put("email", "xiejava@ishareread.com"); //通过JSONArray包装对象数组 JSONArray jArray=new JSONArray(); jArray.addAll(cards); jObject.put("cardList", jArray); String json2=jObject.toJSONString(); System.out.println(json2); //3.通过JSON对象生成JSON串 JSONObject jObject2=new JSONObject(); jObject2.put("username", "xiejava"); jObject2.put("sex", "man"); jObject2.put("age", 38); jObject2.put("email", "xiejava@ishareread.com"); //构造JSON字符串 String cardjsonStr1="{"cardName":"bankCard1","cardCode":"888888888","cardValue":99999999}"; String cardjsonStr2="{"cardName":"bankCard2","cardCode":"999999999","cardValue":222222222}"; JSON.parSEObject(cardjsonStr1); JSONArray jArray2=new JSONArray(); //将JSON字符串转成JSON对象,加入到JSONArray,[注意一定要用JSON.parSEObject()方法转换成JSON对象,否则还是字符串,转成JSON串的时候会带双引号。] jArray2.add(JSON.parSEObject(cardjsonStr1)); jArray2.add(JSON.parSEObject(cardjsonStr2)); jObject2.put("cardList", jArray2); String json3=jObject2.toJSONString(); System.out.println(json3); } }

pom.xml中引入fastjson包

com.alibabafastjson1.2.15

运行结果

{"cardList":[{"cardName":"bankCard1","cardCode":"888888888","cardValue":99999999},{"cardName":"bankCard1","cardCode":"999999999","cardValue":222222222}],"sex":"man","age":38,"email":"xiejava@ishareread.com","username":"xiejava"} 

{"cardList":[{"cardCode":"888888888","cardName":"bankCard1","cardValue":99999999},{"cardCode":"999999999","cardName":"bankCard1","cardValue":222222222}],"sex":"man","age":38,"email":"xiejava@ishareread.com","username":"xiejava"} 

{"cardList":[{"cardName":"bankCard1","cardCode":"888888888","cardValue":99999999},{"cardName":"bankCard2","cardCode":"999999999","cardValue":222222222}],"sex":"man","age":38,"email":"xiejava@ishareread.com","username":"xiejava"}

Gson中@JsonAdater注解的几种方式总结

Gson中@JsonAdater注解的几种方式总结

Gson @JsonAdater注解的几种方式

总结

可以通过自定义TypeAdapter和TypeAdapterFactory的方式,自定义gson的序列化和反序列规则,TypeAdapterFactory可以拿到上下文gson、TokenType类型;

也可以通过继承JsonReader重新写一次代码,在beginArray和endArray想办法跳过array的string形式的左右 双引号", gson.fromJson(myJsonReader, Type)也可以实现 解析时自动将String变为List,但采用注解@JsonAdapter的方式更为正规一些;

问题描述

json字符串:

{
    "cityIds": "[1,2,1001,13131]",
    "types": "[{\"name\": \"biz\",\"details\": [1]}]"
}

java对象定义:

 @Data
    public static class RequestParams {
       // json字符串里对应的是String
        private List<TypeItem> types;
        private List<Integer> cityIds;
    }
    @Data
    public static class TypeItem {
        private String name;
        private List<Integer> details;
    }

可以看到json里面cityIds和types都是String,而pojo里则是List,使用gson的fromJson将json转为pojo会发生报错

方式一

  @JsonAdapter(StringCollectionTypeAdapterFactory.class)
     private List<TagItem> tags;
     @JsonAdapter(StringCollectionTypeAdapterFactory.class)
     private List<Integer> cityIds;
public static class StringCollectionTypeAdapterFactory implements TypeAdapterFactory {
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
            // 为了write的时候能使用到elementTypeAdapter
            Type type = typeToken.getType();
            Class<? super T> rawType = typeToken.getRawType();
            if (!Collection.class.isAssignableFrom(rawType)) {
                return null;
            }
            Type elementType = $Gson$Types.getCollectionElementType(type, rawType);
            TypeAdapter<?> elementTypeAdapter = gson.getAdapter(TypeToken.get(elementType));
            
            TypeAdapter<T> result = new Adapter(gson, elementTypeAdapter, typeToken);
            return result;
        }
        private static final class Adapter<E> extends TypeAdapter<Collection<E>> {
            private final TypeAdapter<E> elementTypeAdapter;
            private final Gson gson;
            private final TypeToken listType;
            public Adapter(Gson context, TypeAdapter<E> elementTypeAdapter, TypeToken listType) {
                this.elementTypeAdapter = elementTypeAdapter;
                this.gson = context;
                this.listType = listType;
            }
            @Override public Collection<E> read(JsonReader in) throws IOException {
                if (in.peek() == JsonToken.NULL) {
                    in.nextNull();
                    return null;
                }
                List<E> list = gson.fromJson(in.nextString(), listType.getType());
                return list;
            }
 
            // write后可以将array的string格式,重新变成array
            @Override public void write(JsonWriter out, Collection<E> collection) throws IOException {
                if (collection == null) {
                    out.nullValue();
                    return;
                }
                out.beginArray();
                for (E element : collection) {
                    elementTypeAdapter.write(out, element);
                }
                out.endArray();
            }
        }
    }

方式二-write原样

public static class StringCollectionTypeAdapterFactory1 implements TypeAdapterFactory {
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
            return new Adapter(gson, typeToken);
        }
        private static final class Adapter<E> extends TypeAdapter<Collection<E>> {
            private final Gson gson;
            private final TypeToken listType;
            public Adapter(Gson context, TypeToken listType) {
                this.gson = context;
                this.listType = listType;
            }
            @Override public Collection<E> read(JsonReader in) throws IOException {
                if (in.peek() == JsonToken.NULL) {
                    in.nextNull();
                    return null;
                }
                List<E> list = gson.fromJson(in.nextString(), listType.getType());
                return list;
            }
            @Override public void write(JsonWriter out, Collection<E> collection) throws IOException {
                if (collection == null) {
                    out.nullValue();
                    return;
                }
                out.value(gson.toJson(collection));
            }
        }
    }

方式三-简单写法

private static class CollectionStringTypeAdapterFactory implements TypeAdapterFactory {
        @Override
        public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
            return new TypeAdapter<T>() {
                @Override
                public void write(JsonWriter out, T value) throws IOException {
                    if (value == null) {
                        out.nullValue();
                        return;
                    }
                    gson.getAdapter(type).write(out, value);
                }
                @Override
                public T read(JsonReader in) throws IOException {
                    if (in.peek() == JsonToken.NULL) {
                        return null;
                    }
                    if (in.peek() == JsonToken.BEGIN_ARRAY) {
                        return gson.getAdapter(type).read(in);
                    }
                    T collection = gson.fromJson(in.nextString(), type.getType());
                    return collection;
                }
            };
        }
    }

测试用例如下所示:

@Test
    public void testGson1() {
        Gson gson = new Gson();
        RequestParams requestParam;
        String json;
        // 1.自动将string转为属性的List
        json = "{\"id\": \"000000\",\"types\": \"[{\\\"name\\\":\\\"name1\\\",\\\"list\\\":[1,2]},{\\\"name\\\":\\\"name2\\\",\\\"list\\\":[3,4]}]\",\"keywordIds\": \"[12,13]\"}";
        System.out.println(json);
        requestParam = gson.fromJson(json, new TypeToken<RequestParams>() {}.getType());
        Assert.assertTrue(requestParam.getTypes().get(0).getClass().getName().indexOf("TypeItem") >= 0);
        System.out.println(gson.toJson(requestParam));
        // 2.jsonArray也可以转为List
        json = "{\"id\": \"000000\",\"keywordIds\": [12,13],\"types\": [{\"name\":\"name1\",\"list\":[1,2]},{\"name\":\"name2\",\"list\":[3,4]}]}";
        requestParam = gson.fromJson(json, new TypeToken<RequestParams>() {}.getType());
        Assert.assertTrue(requestParam.getTypes().get(0).getClass().getName().indexOf("TypeItem") >= 0);
        System.out.println(gson.toJson(requestParam));
        // 3.换行的方式呢
        json = "{\n" +
                "\t\"id\": \"000000\",\n" +
                "\t\"keywordIds\": [12,13],\n" +
                "\t\"types\": [{\"name\":\"name1\",\"list\":[1,2]},{\"name\":\"name2\",\"list\":[3,4]}]\n" +
                "}";
        requestParam = gson.fromJson(json, new TypeToken<RequestParams>() {}.getType());
        Assert.assertTrue(requestParam.getTypes().get(0).getClass().getName().indexOf("TypeItem") >= 0);
        System.out.println(gson.toJson(requestParam));
        // 4.能否将List里面的Integer变成String呢
        json = "{\n" +
                "\t\"id\": \"000000\",\n" +
                "\t\"keywordIds\": [12,13],\n" +
                "\t\"types\": [{\"name\":\"name1\",\"list1\":[1,2]},{\"name\":\"name2\",\"list1\":[3,4]}]\n" +
                "}";
        requestParam = gson.fromJson(json, new TypeToken<RequestParams>() {}.getType());
        Assert.assertTrue(requestParam.getTypes().get(0).getClass().getName().indexOf("TypeItem") >= 0);
        System.out.println(gson.toJson(requestParam));
        // 5.能否将List里面的Integer变成String
        json = "{\n" +
                "\t\"id\": \"000000\",\n" +
                "\t\"keywordIds1\": [12,13],\n" +
                "\t\"types\": [{\"name\":\"name1\",\"list1\":[1,2]},{\"name\":\"name2\",\"list1\":[3,4]}]\n" +
                "}";
        requestParam = gson.fromJson(json, new TypeToken<RequestParams>() {}.getType());
        Assert.assertTrue(requestParam.getTypes().get(0).getClass().getName().indexOf("TypeItem") >= 0);
        System.out.println(gson.toJson(requestParam));
        // 6.自动将string转为属性的List, 并且list里面的Integer变为String
        json = "{\"id\": \"000000\",\"types\": \"[{\\\"name\\\":\\\"name1\\\",\\\"list1\\\":[1,2]},{\\\"name\\\":\\\"name2\\\",\\\"list1\\\":[3,4]}]\",\"keywordIds1\": \"[12,13]\"}";
        System.out.println(json);
        requestParam = gson.fromJson(json, new TypeToken<RequestParams>() {}.getType());
        Assert.assertTrue(requestParam.getTypes().get(0).getClass().getName().indexOf("TypeItem") >= 0);
        System.out.println(gson.toJson(requestParam));
    }
    @Data
    public static class RequestParams {
        private String id;
        @JsonAdapter(CollectionStringTypeAdapterFactory.class)
        private List<TypeItem> types;
        @JsonAdapter(CollectionStringTypeAdapterFactory.class)
        private List<Integer> keywordIds;
        @JsonAdapter(CollectionStringTypeAdapterFactory.class)
        private List<String> keywordIds1;
    }
    @Data
    public static class TypeItem {
        private String name;
        private List<Integer> list;
        private List<String> list1;
    }

Gson注解

@SerializedName

主要应用在Gson解析json字符串时。Gson能直接将json字符串解析成java对象或者集合,也能将java对象转换为json字符串表示。例如有json数据如下:

{
    "id":"1"
    "n":"zhangsan"
    "p":"123456"
    "s":"0"
}

它能被解析到下面这个对象

public class User{
    private String id;
    private String n;
    private String p;
    private string s;
}

默认在字段名相同的字段间解析,所以User类必须要这样写才能直接使用Gson解析出来,但是java对象里的属性名和json里的字段名有时会不一样。Gson提供注解的方法来解决这个问题。

public class User{
 
    private String id;
 
    @SerializedName("n")
    private String userName;
 
    @SerializedName("p")
    private String password;
 
    @SerializedName("s")
    private String sex;
}

Expose

通常与@SerializedName连用,当我们不想把某个属性包含到json中时可以用。

public class UserSimple {  
    @Expose()
    String name; // equals serialize & deserialize
 
    @Expose(serialize = false, deserialize = false)
    String email; 
 
    @Expose(serialize = false)
    int age; 
 
    @Expose(deserialize = false)
    boolean isDeveloper; // equals only serialize
}

序列化的结果将只有name和isDeveloper出现在json中,因为serialize都是false。反序列化时,java对象将只会拥有json中的name和age,因为diserialze是true。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

您可能感兴趣的文章:
  • JAVA使用Gson解析json数据实例解析
  • Gson序列化指定忽略字段的三种写法详解
  • GSON实现Java对象与JSON格式对象相互转换的完全教程

jackson java转json hibernate懒加载造成的无限递归问题

jackson java转json hibernate懒加载造成的无限递归问题

<divid="content_views">

<p><span><span>@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties</span></span></p> <p><span>jackson中的@JsonBackReference和@JsonManagedReference,以及@JsonIgnore均是为了解决对象中存在双向引用导致的无限递归(infinite recursion)问题。这些标注均可用在属性或对应的get、set方法中。&nbsp;</span><span>&nbsp;</span></p> <br><span>@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(serialization,即将对象转换为json数据)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(deserialization,即json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入@JsonBackReference标注的属性。&nbsp;</span><span>&nbsp;</span><br><br><p><span>@JsonIgnore:直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。在父子关系中,当反序列化时,@JsonIgnore不会自动注入被忽略的属性值(父或子),这是它跟@JsonBackReference和@JsonManagedReference最大的区别。</span></p> <p><br></p> <p><span><span>@JsonIgnoreProperties 用法</span></span></p> <p><span></span></p> <pre><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span>//忽略parent models属性</span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div><span>@JsonIgnoreProperties</span>({<span>"parent"</span>,<span>"models"</span>})</div></div></li><li><div><divdata-line-number="3"></div></div><div><div><span>public</span> <span><span>class</span> <span>Module</span></span>{</div></div></li><li><div><divdata-line-number="4"></div></div><div><div> <span>@OneToMany</span>(fetch=FetchType.LAZY,mappedBy=<span>"parent"</span>,cascade=CascadeType.REMOVE)</div></div></li><li><div><divdata-line-number="5"></div></div><div><div> <span>public</span> java.util.List&lt;Module&gt; models;</div></div></li><li><div><divdata-line-number="6"></div></div><div><div> </div></div></li><li><div><divdata-line-number="7"></div></div><div><div> <span>@ManyToOne</span>(fetch=FetchType.LAZY)</div></div></li><li><div><divdata-line-number="8"></div></div><div><div> <span>@JoinColumn</span>(name=<span>"parent_id"</span>,referencedColumnName=<span>"id"</span>)</div></div></li><li><div><divdata-line-number="9"></div></div><div><div> <span>public</span> Module parent;</div></div></li><li><div><divdata-line-number="10"></div></div><div><div>}</div></div></li></ol></code><divdata-title="登录后复制" onclick="hljs.signin(event)"></div></pre> <pre></pre> <pre></pre> <p><br></p> <p><span>@JsonFilter用法</span></p> <p><span></span></p> <pre><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span>//忽略parent models属性</span></div></div></li><li><div><divdata-line-number="2"></div></div><div><div><span>@JsonFilter</span>(<span>"module"</span>)</div></div></li><li><div><divdata-line-number="3"></div></div><div><div><span>public</span> <span><span>class</span> <span>Module</span></span>{</div></div></li><li><div><divdata-line-number="4"></div></div><div><div> <span>@OneToMany</span>(fetch=FetchType.LAZY,mappedBy=<span>"parent"</span>,cascade=CascadeType.REMOVE)</div></div></li><li><div><divdata-line-number="5"></div></div><div><div> <span>public</span> java.util.List&lt;Module&gt; models;</div></div></li><li><div><divdata-line-number="6"></div></div><div><div> </div></div></li><li><div><divdata-line-number="7"></div></div><div><div> <span>@ManyToOne</span>(fetch=FetchType.LAZY)</div></div></li><li><div><divdata-line-number="8"></div></div><div><div> <span>@JoinColumn</span>(name=<span>"parent_id"</span>,referencedColumnName=<span>"id"</span>)</div></div></li><li><div><divdata-line-number="9"></div></div><div><div> <span>public</span> Module parent;</div></div></li><li><div><divdata-line-number="10"></div></div><div><div>}</div></div></li></ol></code><divdata-title="登录后复制" onclick="hljs.signin(event)"></div></pre><pre><code><ol><li><div><divdata-line-number="1"></div></div><div><div>测试代码:</div></div></li><li><div><divdata-line-number="2"></div></div><div><div>Module <span>module</span>=moduleService.findModuleByName(<span>"文件管理"</span>);</div></div></li><li><div><divdata-line-number="3"></div></div><div><div>ObjectMapper mapper=<span>new</span> ObjectMapper();</div></div></li><li><div><divdata-line-number="4"></div></div><div><div>FilterProvider filterProvider=<span>new</span> SimpleFilterProvider().addFilter(<span>"module"</span>, SimpleBeanPropertyFilter.serializeAllExcept(<span>"parent"</span>,<span>"models"</span>));</div></div></li><li><div><divdata-line-number="5"></div></div><div><div>mapper.setFilters(filterProvider);</div></div></li><li><div><divdata-line-number="6"></div></div><div><div>String resultString=mapper.writeValueAsString(<span>module</span>);</div></div></li></ol></code><divdata-title="登录后复制" onclick="hljs.signin(event)"></div></pre> <p></p> <pre></pre> <p></p> <pre></pre> <p><span>JsonFilter可以动态指定过滤的属性,缺点:每次转换都要设置过滤器,否则会报错,就这点很不爽。既然不爽就换种方式过滤,使用fastjson,请看下面的代码:</span></p> <p><span></span></p> <pre><code><ol><li><div><divdata-line-number="1"></div></div><div><div><span>package</span> com.company.project.common.util;</div></div></li><li><div><divdata-line-number="2"></div></div><div><div> </div></div></li><li><div><divdata-line-number="3"></div></div><div><div><span>import</span> java.util.Map;</div></div></li><li><div><divdata-line-number="4"></div></div><div><div><span>import</span> java.util.Map.Entry;</div></div></li><li><div><divdata-line-number="5"></div></div><div><div><span>import</span> java.util.Set;</div></div></li><li><div><divdata-line-number="6"></div></div><div><div> </div></div></li><li><div><divdata-line-number="7"></div></div><div><div><span>import</span> com.alibaba.fastjson.JSON;</div></div></li><li><div><divdata-line-number="8"></div></div><div><div><span>import</span> com.alibaba.fastjson.serializer.JSONSerializer;</div></div></li><li><div><divdata-line-number="9"></div></div><div><div><span>import</span> com.alibaba.fastjson.serializer.PropertyFilter;</div></div></li><li><div><divdata-line-number="10"></div></div><div><div><span>import</span> com.alibaba.fastjson.serializer.SerializeWriter;</div></div></li><li><div><divdata-line-number="11"></div></div><div><div><span>import</span> com.alibaba.fastjson.serializer.SerializerFeature;</div></div></li><li><div><divdata-line-number="12"></div></div><div><div> </div></div></li><li><div><divdata-line-number="13"></div></div><div><div><span>public</span> <span><span>class</span> <span>JsonHelpler</span> </span>{</div></div></li><li><div><divdata-line-number="14"></div></div><div><div> </div></div></li><li><div><divdata-line-number="15"></div></div><div><div> <span><span>public</span> <span>static</span> String <span>toJSON</span><span>(Object o)</span></span>{</div></div></li><li><div><divdata-line-number="16"></div></div><div><div> <span>return</span> JSON.toJSONString(o,SerializerFeature.WriteMapNullValue);</div></div></li><li><div><divdata-line-number="17"></div></div><div><div> }</div></div></li><li><div><divdata-line-number="18"></div></div><div><div> </div></div></li><li><div><divdata-line-number="19"></div></div><div><div> <span><span>public</span> <span>static</span> SerializeWriter <span>toJSON</span><span>(Object obj, <span>final</span> Map&lt;Class&lt;?&gt;, Set&lt;String&gt;&gt; includeMap)</span></span>{</div></div></li><li><div><divdata-line-number="20"></div></div><div><div> PropertyFilter filter = <span>new</span> PropertyFilter() {</div></div></li><li><div><divdata-line-number="21"></div></div><div><div> <span>@Override</span></div></div></li><li><div><divdata-line-number="22"></div></div><div><div> <span><span>public</span> <span>boolean</span> <span>apply</span><span>(Object source, String name, Object value)</span> </span>{</div></div></li><li><div><divdata-line-number="23"></div></div><div><div> <span>for</span>(Entry&lt;Class&lt;?&gt;, Set&lt;String&gt;&gt; entry : includeMap.entrySet()) { </div></div></li><li><div><divdata-line-number="24"></div></div><div><div> Class&lt;?&gt; class1 = entry.getKey(); </div></div></li><li><div><divdata-line-number="25"></div></div><div><div> <span>if</span>(source.getClass() == class1){ </div></div></li><li><div><divdata-line-number="26"></div></div><div><div> Set&lt;String&gt; fields = entry.getValue(); </div></div></li><li><div><divdata-line-number="27"></div></div><div><div> <span>for</span>(String field : fields) { </div></div></li><li><div><divdata-line-number="28"></div></div><div><div> <span>if</span>(field.equals(name)){ </div></div></li><li><div><divdata-line-number="29"></div></div><div><div> <span>return</span> <span>false</span>; </div></div></li><li><div><divdata-line-number="30"></div></div><div><div> } </div></div></li><li><div><divdata-line-number="31"></div></div><div><div> } </div></div></li><li><div><divdata-line-number="32"></div></div><div><div> } </div></div></li><li><div><divdata-line-number="33"></div></div><div><div> }</div></div></li><li><div><divdata-line-number="34"></div></div><div><div> <span>return</span> <span>true</span>; </div></div></li><li><div><divdata-line-number="35"></div></div><div><div> } };</div></div></li><li><div><divdata-line-number="36"></div></div><div><div> SerializeWriter sw = <span>new</span> SerializeWriter(); </div></div></li><li><div><divdata-line-number="37"></div></div><div><div> JSONSerializer serializer = <span>new</span> JSONSerializer(sw);</div></div></li><li><div><divdata-line-number="38"></div></div><div><div> serializer.getPropertyFilters().add(filter);</div></div></li><li><div><divdata-line-number="39"></div></div><div><div> serializer.write(obj);</div></div></li><li><div><divdata-line-number="40"></div></div><div><div> <span>return</span> sw;</div></div></li><li><div><divdata-line-number="41"></div></div><div><div> }</div></div></li><li><div><divdata-line-number="42"></div></div><div><div> </div></div></li><li><div><divdata-line-number="43"></div></div><div><div>}</div></div></li><li><div><divdata-line-number="44"></div></div><div><div> </div></div></li><li><div><divdata-line-number="45"></div></div><div><div>测试代码</div></div></li><li><div><divdata-line-number="46"></div></div><div><div>Map&lt;Class&lt;?&gt;, Set&lt;String&gt;&gt; includeMap = <span>new</span> HashMap&lt;Class&lt;?&gt;, Set&lt;String&gt;&gt;();</div></div></li><li><div><divdata-line-number="47"></div></div><div><div>Set&lt;String&gt; set = <span>new</span> HashSet&lt;String&gt;();</div></div></li><li><div><divdata-line-number="48"></div></div><div><div>set.add(<span>"parent"</span>);</div></div></li><li><div><divdata-line-number="49"></div></div><div><div>set.add(<span>"models"</span>);</div></div></li><li><div><divdata-line-number="50"></div></div><div><div>includeMap.put(Module.class, set);</div></div></li><li><div><divdata-line-number="51"></div></div><div><div>SerializeWriter resultString=JsonHelpler.toJSON(<span>module</span>, includeMap);</div></div></li><li><div><divdata-line-number="52"></div></div><div><div>System.out.println(resultString);</div></div></li></ol></code><divdata-title="登录后复制" onclick="hljs.signin(event)"></div></pre><br><br><p></p> <br><p></p> 原文地址:https://blog.csdn.net/cym19890801/article/details/49660105 </div>

Java - 格式化输出JSON字符串的两种方式

Java - 格式化输出JSON字符串的两种方式

[TOC]

1 使用阿里的FastJson

1.1 项目的pom.xml依赖

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.58</version>
</dependency>

1.2 Java示例代码

(1) 导入的包:

com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;

(2) 测试代码:

其中JSON字符串为: {"_index":"book_shop","_type":"it_book","_id":"1","_score":1.0,"_source":{"name": "Java编程思想(第4版)","author": "[美] Bruce Eckel","category": "编程语言","price": 109.0,"publisher": "机械工业出版社","date": "2007-06-01","tags": [ "Java", "编程语言" ]}}

public static void main(String[] args) {

    String jsonString = "{\"_index\":\"book_shop\",\"_type\":\"it_book\",\"_id\":\"1\",\"_score\":1.0," +
            "\"_source\":{\"name\": \"Java编程思想(第4版)\",\"author\": \"[美] Bruce Eckel\",\"category\": \"编程语言\"," +
            "\"price\": 109.0,\"publisher\": \"机械工业出版社\",\"date\": \"2007-06-01\",\"tags\": [ \"Java\", \"编程语言\" ]}}";

    JSONObject object = JSONObject.parseObject(jsonString);
    String pretty = JSON.toJSONString(object, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue, 
            SerializerFeature.WriteDateUseDateFormat);

    System.out.println(pretty);
}

(3) 格式化输出后的结果:

说明: FastJson通过Tab键进行换行后的格式化.

{
	"_index":"book_shop",
	"_type":"it_book",
	"_source":{
		"date":"2007-06-01",
		"author":"[美] Bruce Eckel",
		"price":109.0,
		"name":"Java编程思想(第4版)",
		"publisher":"机械工业出版社",
		"category":"编程语言",
		"tags":[
			"Java",
			"编程语言"
		]
	},
	"_id":"1",
	"_score":1.0
}

2 使用谷歌的Gson

2.1 项目的pom.xml依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.2.4</version>
</dependency>

2.2 Java示例代码

(1) 导入的包:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

(2) 测试代码:

JSON字符串与上述测试代码相同.

public static void main(String[] args) {
    
    String jsonString = "{\"_index\":\"book_shop\",\"_type\":\"it_book\",\"_id\":\"1\",\"_score\":1.0," +
            "\"_source\":{\"name\": \"Java编程思想(第4版)\",\"author\": \"[美] Bruce Eckel\",\"category\": \"编程语言\"," +
            "\"price\": 109.0,\"publisher\": \"机械工业出版社\",\"date\": \"2007-06-01\",\"tags\": [ \"Java\", \"编程语言\" ]}}";
	
	String pretty = toPrettyFormat(jsonString)
	
	System.out.println(pretty);
}

/**
 * 格式化输出JSON字符串
 * @return 格式化后的JSON字符串
 */
private static String toPrettyFormat(String json) {
	JsonParser jsonParser = new JsonParser();
	JsonObject jsonObject = jsonParser.parse(json).getAsJsonObject();
	Gson gson = new GsonBuilder().setPrettyPrinting().create();
	return gson.toJson(jsonObject);
}

(3) 格式化输出后的结果:

说明: Gson使用2个空格作为换行后的格式转换.

{
  "_index": "book_shop",
  "_type": "it_book",
  "_id": "1",
  "_score": 1.0,
  "_source": {
    "name": "Java编程思想(第4版)",
    "author": "[美] Bruce Eckel",
    "category": "编程语言",
    "price": 109.0,
    "publisher": "机械工业出版社",
    "date": "2007-06-01",
    "tags": [
      "Java",
      "编程语言"
    ]
  }
}

参考资料

JAVA-Gson-格式化输出json字符串

版权声明

出处: 博客园 瘦风的博客(https://www.cnblogs.com/shoufeng)

感谢阅读, 如果文章有帮助或启发到你, 点个[<a href="javascript:void(0);" onclick="DiggIt(11196500,cb_blogId,1);green_channel_success(this,''谢谢推荐'');">好文要顶</a>] 或 [<a href="javascript:void(0);" onclick="votePost(11196500,''Digg'')">推荐</a>] 吧

本文版权归博主所有, 欢迎转载, 但 [必须在文章页面明显位置标明原文链接], 否则博主保留追究相关人员法律责任的权利.

java ajax返回 Json 的 几种方式

java ajax返回 Json 的 几种方式

原文:https://blog.csdn.net/qq_26289533/article/details/78749057

方式 1. : 自写代码转 Json 

需要  HttpHttpServletRequest request  HttpServletResponse response 

后台 :

@RequestMapping(value="/haha")

public string xxx { HttpHttpServletRequest request,HttpServletResponse response} 
{ JSONObject json =new JSONObject();
json.put("result"," success")
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter out = null;
out = response.getWriter();
out.write(json.toString()); 
}

 


前端 : 

$.ajax({
data : {
// userNameOrTel: $("#user").val(),
// password: $("#pwd").val()
},
type : "post", 
url : "admin/login/",
dataType : "json",
contentType : "application/json;charset=utf-8", 
async : false, //同步 异步
success : function(data) {
debugger; 
}
}
});

 


方式 2:  @ResponseBody 注解 

@ResponseBody 
@RequestMapping(value="/haha")
public Msg xxx {} 
{ return msg }

$.ajax({
data : {
// userNameOrTel: $("#name").val(),
// password: $("#pwd").val()
},
type : "post",
url : "haha",
dataType : "json",
//contentType : "application/json;charset=utf-8", // 区别在这里,不要加,不然接收不到请求参数
async : false, //同步异步
success : function(msg) {
debugger;}}});


方式 3 :  @RestController 注解 (此类里的所以方法返回值都是 Json) 

拓展知识  当遇到 ajax 请求参数必须是Json 格式的话如下 : 

前端 ajax :

data:JSON.stringify({''channelId'':channelId}),
success:function(data){
alert(data.channelId);
},

contentType:''application/json;charset=utf-8''
后台 : 

@RequestMapping(value="/login",produces="application/json;charset=UTF-8") @ResponseBody public String test2() { } 

 

今天关于Java转JSON串的几种方式java 转 json的讲解已经结束,谢谢您的阅读,如果想了解更多关于Gson中@JsonAdater注解的几种方式总结、jackson java转json hibernate懒加载造成的无限递归问题、Java - 格式化输出JSON字符串的两种方式、java ajax返回 Json 的 几种方式的相关知识,请在本站搜索。

本文标签: