工具篇-Json处理

1. @JsonProperty和@SerializedName注解

  • 使用场景
将一个json格式的字符串转换成某个java对象,或者将一个java对象转换成json格式的字符串时,如果json字符串中的字段跟java对象中定义的属性名不一致,需要在java对象的属性上加上@JsonProperty或@SerializedName进行转换。
  • 示例
1 @JsonProperty("jsonName")
2 private String name;
或者1 @SerializedName("jsonName")
2 private String name;
  • 区别
JsonProperty注解使用的是Jackson包,SerializedName注解使用的是Gson包,使用时避免包冲突。附上两个包的官方网站:

2. FastJson(该部分主要参考:FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换

FastJson主要用到了以下三个类:
JSON:FastJson的解析器,用于JSON格式字符串、JSON对象及javaBean之间的转换;

Json对象JSONObject

Json数组对象JSONArray

JSONObject和JSONArray继承了JSON,可以直接用于转换。首先,JSONObject本质上可以看作一个Map<String,Object>

1 public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable, InvocationHandler {

然后,JSONArray本质上可以看作是一个List<Object>

1 public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {

FastJson的一些使用如下所示:

  • Json串转换成JSONObject

原始字符串:
1 {"header":{"code":0,"message":"SUCCESS"},"data":{"id":48,"metric.name":"test_hk_1","metric.type":"kafka_commit","partition.lag":false,"group.id":""}}
转换过程:
1 import com.alibaba.fastjson.JSONObject;
2 JSONObject jsonObject = JSONObject.parseObject(contentAsString).getJSONObject("data");
  • JSONObject转换成Json字符串
1 String str = JSONObject.toJSONString(jsonObject);
  • Json字符串转换成JSONArray

原始字符串

1 private static final String  JSON_ARRAY_STR = "[{\"studentName\":\"lily\",\"studentAge\":12},{\"studentName\":\"lucy\",\"studentAge\":15}]";

转换过程

1 import com.alibaba.fastjson.JSONArray;
2         JSONArray jsonArray = JSONArray.parseArray(JSON_ARRAY_STR);
3         
4         for (Object obj : jsonArray) {
5             JSONObject jsonObject = (JSONObject) obj;
6         }
7 }    
  • Json字符串转换成JavaBean

原始字符串同上例,JavaBean如下所示

 1 public class Student {
 2 
 3     private String studentName;
 4     private Integer studentAge;
 5 
 6     public String getStudentName() {
 7         return studentName;
 8     }
 9 
10     public void setStudentName(String studentName) {
11         this.studentName = studentName;
12     }
13 
14     public Integer getStudentAge() {
15         return studentAge;
16     }
17 
18     public void setStudentAge(Integer studentAge) {
19         this.studentAge = studentAge;
20     }
21 }

转换过程

1 Student student = JSONObject.parseObject(JSON_OBJ_STR, new TypeReference<Student>() {});

或者

1 Student student = JSONObject.parseObject(JSON_OBJ_STR, Student.class);
  • JavaBean转换成Json字符串
1 String res = JSON.toJSONString(student);

⚠️注意⚠️:如果这里student对象没有getter方法,无法转换成Json字符串的。另外,在转换Json字符串的过程中,可以对特殊字段进行设置,比如将对象中属性的null值输出:

1 String str = JSONObject.toJSONString(student, SerializerFeature.WriteMapNullValue);
QuoteFieldNames 输出key时是否使用双引号,默认为true
WriteMapNullValue 输出值为null的字段,是否默认为false
WriteNullNumberAsZero 数值字段如果为null,输出为0,而非null
WriteNullListAsEmpty List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty 字符类型字段如果为null,输出为"",而非null
WriteNullBooleanAsFalse Boolean字段如果为null,输出为false,而非null

  • JavaBean转换成JSONObject或者JSONArray对象
1 JSONObject jsonObject = (JSONObject)JSON.toJSON(student);
  • 克隆对象

浅拷贝

1 JSONObject b = new JSONObject(a);

深拷贝

1 JSONObject b = (JSONObject)a.clone(); 

上边的深拷贝不好使的话,可以考虑下边这个

1 private Object deepCopyByJson(Object obj) {
2      String json = JSON.toJSONString(obj);
3      return JSON.parseObject(json, Object.class);
4 }

3. Json字符串格式

json字符串中null类型的value如下所示:
1 "{\"header\":{\"code\":34,\"message\":\"job id doesn't exist.\"},\"data\":null}"

boolean,int等类型的value如下所示:

1 "{\"header\":{\"code\":0,\"message\":\"SUCCESS\"},\"data\":{\"id\":48,\"metric.type\":\"kafka_commit\",\"consumer.zk.host\":\"\",\"consumer.zk.port\":2181,\"consumer.zk.root\":\"/brokers\",\"enabled\":true,\"group.id\":\"\"}}"

 

 


 

posted @ 2019-04-20 21:21  akia开凯  阅读(368)  评论(0编辑  收藏  举报