Json解析-Jackson使用教程
日常求贊,感謝老闆。
歡迎關注公眾號:其實是白羊。乾貨持續更新中......
一、JSON解析
我這裡指的解析是:JSON和JavaObject之間的序列化和反序列化。
如果你的專案進行了前後端分離,那你一定使用過JSON進行資料互動,那在後端就一定會涉及到對Json資料的解析,雖然使用SpringMvc加上@requestBody都已經幫我們解析好並對映到bean裡了,但是他底層也是通過這些JSON解析類庫來完成的(SpringMVC預設使用的就是Jackson)。在我們後端直接調其他服務的介面時,很多也會返回JSON資料也需要我們自己使用這些類庫來進行解析。
二、常見的JSON解析類庫
- fastjson:阿里出品的一個JSON解析類庫,很快,提供了很多靜態方法使用方便,但是底層實現不是很好,解析過程中使用String的substring,效能很好,但是可能會導致記憶體洩漏。
- Gson:谷歌出品的JSOn解析類庫,但是效能相較於其他連個稍微差點。
- Jackson:相對比較推薦的一種JSON解析類庫,效能好穩定。Jackson的原始碼託管在:github.com/FasterXML/j…
三、Jackson使用
1、Maven依賴引入
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-version}</version>
</dependency>
<!-- 其中Jackson Annotations依賴Jackson Core,Jackson Databind依賴Jackson Annotations。-->
複製程式碼
2、基本使用
反序列化
- 使用ObjectMapper,將json字串轉成物件:
String str = "{\"id\":1,\"name\":\"haha\",\"elements\":[{\"age\":1,\"elName\":\"zll\"},{\"age\":2,\"elName\":\"zll1\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
TestBean testBean = objectMapper.readValue(str, TestBean.class);
System.out.println(testBean.toString());
複製程式碼
執行結果:
TestBean(id=1, name=haha, elements=[Element(age=1, elName=zll), Element(age=2, elName=zll1)])
複製程式碼
- 使用ObjectMapper,讀取json某些欄位值
String str = "{\"id\":1,\"name\":\"haha\",\"elements\":[{\"age\":1,\"elName\":\"zll\"},{\"age\":2,\"elName\":\"zll1\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(str);
//獲取name欄位值
JsonNode name = jsonNode.get("name");
String s = name.asText();
System.out.println(s);
//獲取elements欄位下陣列第二個物件的age
JsonNode elements = jsonNode.get("elements");
JsonNode object2 = elements.get(1);//從0開始哦
JsonNode age = object2.get("age");
int i = age.asInt();
System.out.println(i);
複製程式碼
執行結果:
haha
2
複製程式碼
序列化
- ObjectMapper(將JavaObject轉化成JSON)
Element element = new Element();
element.setAge(1);
element.setElName("zll");
ObjectMapper objectMapper = new ObjectMapper();
String elementStr = objectMapper.writeValueAsString(element);
System.out.println(elementStr);
複製程式碼
輸出結果如下:
{"age":1,"elName":"zll"}
複製程式碼
其他常用序列化方法:
- writeValue(File arg0, Object arg1)把arg1轉成json序列,並儲存到arg0檔案中
- writeValue(OutputStream arg0, Object arg1)把arg1轉成json序列,並儲存到arg0輸出流中。
- teValueAsBytes(Object arg0)把arg0轉成json序列,並把結果輸出成位元組陣列
- writeValueAsString(Object arg0)把arg0轉成json序列,並把結果輸出成字串。
- JsonGenerator(json生成器):
可以根據自己的需要建立相應結構的json
ByteArrayOutputStream bout = new ByteArrayOutputStream();
//JsonFactory jsonFactory = new JsonFactory();
//建立jsonfactory 2種方法
ObjectMapper objectMapper = new ObjectMapper();
JsonFactory jsonFactory = objectMapper.getFactory();
JsonGenerator generator = jsonFactory.createGenerator(bout);
//建立自己需要的json
//建立物件獲取陣列要寫開始和結束
generator.writeStartObject();
//建立一個欄位 第一個引數key 第二個引數value
generator.writeStringField("name","value");
generator.writeNumberField("numberName",1);
//或者直接建立object
generator.writeObjectField("ObjectName","ObjectValue");
//建立陣列
generator.writeArrayFieldStart("arrayName");
//裡面可以是物件、陣列、字串、數字
generator.writeString("element1");
generator.writeNumber(1);
generator.writeNumber(1);
generator.writeEndArray();
generator.writeEndObject();
generator.flush();
generator.close();
String s = bout.toString();
System.out.println(s);
複製程式碼
執行結果:
{"name":"value","numberName":1,"ObjectName":"ObjectValue","arrayName":["element1",1,1]}
複製程式碼
2、ObjectMapper的常用設定
ObjectMapper objectMapper = new ObjectMapper();
//序列化的時候序列物件的所有屬性
objectMapper.setSerializationInclusion(Include.ALWAYS);
//反序列化的時候如果多了其他屬性,不丟擲異常
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//如果是空物件的時候,不拋異常
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
//屬性為null的轉換
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//取消時間的轉化格式,預設是時間戳,可以取消,同時需要設定要表現的時間格式
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
複製程式碼
3、常用註解
-
@JsonIgnoreProperties(ignoreUnknown = true):
將這個註解載入類上,不存在的欄位將被忽略。
-
@JsonIgnoreProperties({ “password”, “secretKey” }):
指定忽略欄位
-
@JsonIgnore:
標在註解上,將忽略此欄位
-
@JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”):
標在時間自端上序列化是使用制定規則格式化(預設轉化成時間戳)
-
@JsonInclude(引數)
JsonInclude.Include.NON_EMPTY:屬性為空或者null都不參與序列化 JsonInclude.Include.NON_NULL:屬性為null不參與序列化
-
@JsonProperty("firstName")
標在欄位上,指定序列化後的欄位名
-
@JsonDeserialize(using= T extends JsonDeserializer.class)和@JsonSerialize(using= T extends JsonSerializer.class)
自定義某些型別欄位的序列化與反序列化規則
四、最後
總結內容
更多資源:其實是白羊
歡迎star
日常求贊
- 如果你認為本文對你有幫助,還請「在看/轉發/贊/star」,多謝
- 如果你還發現了更好或不同的想法,還請在留言區不吝賜教,一起探討交流修改,萬分感謝
歡迎關注公眾號:「其實是白羊」乾貨持續更新中......