工具篇-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之間的轉換;html

Json對象JSONObjectjava

Json數組對象JSONArrayjson

JSONObject和JSONArray繼承了JSON,能夠直接用於轉換。首先,JSONObject本質上能夠看做一個Map<String,Object>數組

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

而後,JSONArray本質上能夠看做是一個List<Object>dom

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

FastJson的一些使用以下所示:網站

  • Json串轉換成JSONObjectthis

原始字符串:
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

原始字符串spa

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

轉換過程code

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以下所示htm

 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\":\"\"}}"
相關文章
相關標籤/搜索