工具篇-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\":\"\"}}"