一文搞定Jackson解析JSON數據

Json解析-Jackson使用教程

平常求贊,感謝老闆。java

歡迎關注公衆號:實際上是白羊。乾貨持續更新中......git

在這裏插入圖片描述

1、JSON解析

我這裏指的解析是:JSON和JavaObject之間的序列化和反序列化。github

若是你的項目進行了先後端分離,那你必定使用過JSON進行數據交互,那在後端就必定會涉及到對Json數據的解析,雖然使用SpringMvc加上@requestBody都已經幫咱們解析好並映射到bean裏了,可是他底層也是經過這些JSON解析類庫來完成的(SpringMVC默認使用的就是Jackson)。在咱們後端直接調其餘服務的接口時,不少也會返回JSON數據也須要咱們本身使用這些類庫來進行解析。json

2、常見的JSON解析類庫

  • fastjson:阿里出品的一個JSON解析類庫,很快,提供了不少靜態方法使用方便,可是底層實現不是很好,解析過程當中使用String的substring,性能很好,可是可能會致使內存泄漏。
  • Gson:谷歌出品的JSOn解析類庫,可是性能相較於其餘連個稍微差點。
  • Jackson:相對比較推薦的一種JSON解析類庫,性能好穩定。Jackson的源代碼託管在:github.com/FasterXML/j…

3、Jackson使用

一、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。-->
複製代碼

二、基本使用

反序列化

  1. 使用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)])
複製代碼
  1. 使用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
複製代碼

序列化

  1. 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);
複製代碼

輸出結果以下:bash

{"age":1,"elName":"zll"}
複製代碼

其餘經常使用序列化方法:app

  • 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序列,並把結果輸出成字符串。
  1. 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]}
複製代碼

二、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"));
複製代碼

三、經常使用註解

  1. @JsonIgnoreProperties(ignoreUnknown = true):

    將這個註解加載類上,不存在的字段將被忽略。

  2. @JsonIgnoreProperties({ 「password」, 「secretKey」 }):

    指定忽略字段

  3. @JsonIgnore:

    標在註解上,將忽略此字段

  4. @JsonFormat(timezone = 「GMT+8」, pattern = 「yyyy-MM-dd HH:mm:ss」):

    標在時間自端上序列化是使用制定規則格式化(默認轉化成時間戳)

  5. @JsonInclude(參數)

    JsonInclude.Include.NON_EMPTY:屬性爲空或者null都不參與序列化 JsonInclude.Include.NON_NULL:屬性爲null不參與序列化

  6. @JsonProperty("firstName")

    標在字段上,指定序列化後的字段名

  7. @JsonDeserialize(using= T extends JsonDeserializer.class)和@JsonSerialize(using= T extends JsonSerializer.class)

    自定義某些類型字段的序列化與反序列化規則

4、最後

總結內容

更多資源:實際上是白羊

歡迎star

平常求贊

  • 若是你認爲本文對你有幫助,還請「在看/轉發/贊/star」,多謝
  • 若是你還發現了更好或不一樣的想法,還請在留言區不吝賜教,一塊兒探討交流修改,萬分感謝

歡迎關注公衆號:「實際上是白羊」乾貨持續更新中......

在這裏插入圖片描述
相關文章
相關標籤/搜索