Json解析-Jackson使用教程
日常求贊蝗肪,感謝老板币喧。
歡迎關注公眾號:其實是白羊屡贺。干貨持續(xù)更新中......
[圖片上傳失敗...(image-1ef3ea-1585817742481)]
一硼身、JSON解析
我這里指的解析是:JSON和JavaObject之間的序列化和反序列化翘贮。
如果你的項目進行了前后端分離幻赚,那你一定使用過JSON進行數(shù)據交互禀忆,那在后端就一定會涉及到對Json數(shù)據的解析,雖然使用SpringMvc加上@requestBody都已經幫我們解析好并映射到bean里了落恼,但是他底層也是通過這些JSON解析類庫來完成的(SpringMVC默認使用的就是Jackson)箩退。在我們后端直接調其他服務的接口時,很多也會返回JSON數(shù)據也需要我們自己使用這些類庫來進行解析领跛。
二乏德、常見的JSON解析類庫
- fastjson:阿里出品的一個JSON解析類庫,很快吠昭,提供了很多靜態(tài)方法使用方便喊括,但是底層實現(xiàn)不是很好,解析過程中使用String的substring矢棚,性能很好郑什,但是可能會導致內存泄漏。
- Gson:谷歌出品的JSOn解析類庫蒲肋,但是性能相較于其他連個稍微差點蘑拯。
- Jackson:相對比較推薦的一種JSON解析類庫,性能好穩(wěn)定兜粘。Jackson的源代碼托管在:https://github.com/FasterXML/jackson申窘。
三、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字段下數(shù)組第二個對象的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序列,并把結果輸出成字節(jié)數(shù)組
- writeValueAsString(Object arg0)把arg0轉成json序列钦椭,并把結果輸出成字符串拧额。
- JsonGenerator(json生成器):
可以根據自己的需要創(chuàng)建相應結構的json
ByteArrayOutputStream bout = new ByteArrayOutputStream();
//JsonFactory jsonFactory = new JsonFactory();
//創(chuàng)建jsonfactory 2種方法
ObjectMapper objectMapper = new ObjectMapper();
JsonFactory jsonFactory = objectMapper.getFactory();
JsonGenerator generator = jsonFactory.createGenerator(bout);
//創(chuàng)建自己需要的json
//創(chuàng)建對象獲取數(shù)組要寫開始和結束
generator.writeStartObject();
//創(chuàng)建一個字段 第一個參數(shù)key 第二個參數(shù)value
generator.writeStringField("name","value");
generator.writeNumberField("numberName",1);
//或者直接創(chuàng)建object
generator.writeObjectField("ObjectName","ObjectValue");
//創(chuàng)建數(shù)組
generator.writeArrayFieldStart("arrayName");
//里面可以是對象、數(shù)組彪腔、字符串势腮、數(shù)字
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);
執(zhí)行結果:
{"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);
//取消時間的轉化格式,默認是時間戳,可以取消,同時需要設置要表現(xiàn)的時間格式
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”):
標在時間自端上序列化是使用制定規(guī)則格式化(默認轉化成時間戳)
- @JsonInclude(參數(shù))
JsonInclude.Include.NON_EMPTY:屬性為空或者null都不參與序列化
JsonInclude.Include.NON_NULL:屬性為null不參與序列化
- @JsonProperty("firstName")
標在字段上署照,指定序列化后的字段名
- @JsonDeserialize(using= T extends JsonDeserializer<FiledType>.class)和@JsonSerialize(using= T extends JsonSerializer<FiledType>.class)
自定義某些類型字段的序列化與反序列化規(guī)則
四、最后
總結內容
更多資源:其實是白羊
歡迎star
日常求贊
- 如果你認為本文對你有幫助吗浩,還請「在看/轉發(fā)/贊/star」建芙,多謝
- 如果你還發(fā)現(xiàn)了更好或不同的想法,還請在留言區(qū)不吝賜教懂扼,一起探討交流修改禁荸,萬分感謝
歡迎關注公眾號:「其實是白羊」干貨持續(xù)更新中......
[圖片上傳失敗...(image-e396e3-1585817742481)]