一文搞定Jackson解析JSON資料
Json解析-Jackson使用教程
日常求贊,感謝老闆。
一、JSON解析
我這裡指的解析是:JSON和JavaObject之間的序列化和反序列化。
如果你的專案進行了前後端分離,那你一定使用過JSON進行資料互動,那在後端就一定會涉及到對Json資料的解析,雖然使用SpringMvc加上@requestBody都已經幫我們解析好並對映到bean裡了,但是他底層也是透過這些JSON解析類庫來完成的(SpringMVC預設使用的就是Jackson)。在我們後端直接調其他服務的介面時,很多也會返回JSON資料也需要我們自己使用這些類庫來進行解析。
二、常見的JSON解析類庫
- fastjson:阿里出品的一個JSON解析類庫,很快,提供了很多靜態方法使用方便,但是底層實現不是很好,解析過程中使用String的substring,效能很好,但是可能會導致記憶體洩漏。
- Gson:谷歌出品的JSOn解析類庫,但是效能相較於其他連個稍微差點。
- Jackson:相對比較推薦的一種JSON解析類庫,效能好穩定。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欄位下陣列第二個物件的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」,多謝
- 如果你還發現了更好或不同的想法,還請在留言區不吝賜教,一起探討交流修改,萬分感謝
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4692/viewspace-2825160/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Jackson 解析json資料之忽略解析欄位註解@JsonIgnorePropertiesJSON
- json資料解析JSON
- json解析效能比較(gson與jackson)JSON
- 終極CRUD-3-用Jackson解析jsonJSON
- JSON解析器之Gson、FastJson、JacksonJSONAST
- 解析大資料json大資料JSON
- 🎩 JSON Wizard for Mac - 解析你的 JSON 資料!🔮JSONMac
- 一文解析Apache Avro資料ApacheVR
- Go - 如何解析 JSON 資料?GoJSON
- Python中解析json資料PythonJSON
- 使用JSONPath解析JSON資料JSON
- JavaScript解析遠端json資料JavaScriptJSON
- Android系列---JSON資料解析AndroidJSON
- Json工具類----JacksonJSON
- 一文徹底搞定Redis與MySQL的資料同步RedisMySql
- 將物件解析為JSON資料和將JSON資料解析為物件的簡單例項物件JSON單例
- js解析json資料例項分析JSON
- android JSON解析資料-解析天氣預報AndroidJSON
- 一文搞定Git!Git
- JSON介紹及Android最全面解析方法(Gson、AS自帶org.son、Jackson解析)JSONAndroid
- 一文說透 MySQL JSON 資料型別(收藏)MySqlJSON資料型別
- Android基礎之json資料解析AndroidJSON
- json listView 資料請求解析小例子JSONView
- Android之json複雜資料解析AndroidJSON
- .net 呼叫API並解析Json資料方法APIJSON
- 教你不程式設計快速解析 JSON 資料程式設計JSON
- ABAP 如何解析 JSON 資料試讀版JSON
- Jackson Gson Json.simple 比較JSON
- Java JSON處理類庫JacksonJavaJSON
- JSON資料如何進行解析呢,方式有哪些?JSON
- jQuery解析json格式資料生成級聯選單jQueryJSON
- 解析json資料生成樹形導航選單JSON
- URL及日期等特殊資料格式處理-JSON框架Jackson精解第2篇JSON框架
- 使用Jackson在Java中處理JSONJavaJSON
- Python JSON 使用指南:解析和轉換資料PythonJSON
- jQuery對JSON格式資料的解析例項程式碼jQueryJSON
- 一文搞定 Spring Data JPASpring
- 用Jackson自定義JSON反序列化JSON