一文搞定Jackson解析JSON數(shù)據(jù)

Json解析-Jackson使用教程

日常求贊,感謝老板。

歡迎關(guān)注公眾號:其實是白羊。干貨持續(xù)更新中......

[圖片上傳失敗...(image-1ef3ea-1585817742481)]

一、JSON解析

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

如果你的項目進(jìn)行了前后端分離,那你一定使用過JSON進(jìn)行數(shù)據(jù)交互,那在后端就一定會涉及到對Json數(shù)據(jù)的解析,雖然使用SpringMvc加上@requestBody都已經(jīng)幫我們解析好并映射到bean里了,但是他底層也是通過這些JSON解析類庫來完成的(SpringMVC默認(rèn)使用的就是Jackson)。在我們后端直接調(diào)其他服務(wù)的接口時,很多也會返回JSON數(shù)據(jù)也需要我們自己使用這些類庫來進(jìn)行解析。

二、常見的JSON解析類庫

  • fastjson:阿里出品的一個JSON解析類庫,很快,提供了很多靜態(tài)方法使用方便,但是底層實現(xiàn)不是很好,解析過程中使用String的substring,性能很好,但是可能會導(dǎo)致內(nèi)存泄漏。
  • Gson:谷歌出品的JSOn解析類庫,但是性能相較于其他連個稍微差點(diǎn)。
  • 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、基本使用

反序列化

  1. 使用ObjectMapper,將json字符串轉(zhuǎn)成對象:
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());

運(yùn)行結(jié)果:

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字段下數(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);

運(yùn)行結(jié)果:

haha
2

序列化

  1. ObjectMapper(將JavaObject轉(zhuǎn)化成JSON)
Element element = new Element();
element.setAge(1);
element.setElName("zll");
ObjectMapper objectMapper = new ObjectMapper();
String elementStr = objectMapper.writeValueAsString(element);
System.out.println(elementStr);

輸出結(jié)果如下:

{"age":1,"elName":"zll"}

其他常用序列化方法:

  • writeValue(File arg0, Object arg1)把a(bǔ)rg1轉(zhuǎn)成json序列,并保存到arg0文件中
  • writeValue(OutputStream arg0, Object arg1)把a(bǔ)rg1轉(zhuǎn)成json序列,并保存到arg0輸出流中。
  • teValueAsBytes(Object arg0)把a(bǔ)rg0轉(zhuǎn)成json序列,并把結(jié)果輸出成字節(jié)數(shù)組
  • writeValueAsString(Object arg0)把a(bǔ)rg0轉(zhuǎn)成json序列,并把結(jié)果輸出成字符串。
  1. JsonGenerator(json生成器):

可以根據(jù)自己的需要創(chuàng)建相應(yīng)結(jié)構(gòu)的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ù)組要寫開始和結(jié)束
        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í)行結(jié)果:

{"name":"value","numberName":1,"ObjectName":"ObjectValue","arrayName":["element1",1,1]}

2、ObjectMapper的常用設(shè)置

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的轉(zhuǎn)換
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 
//取消時間的轉(zhuǎn)化格式,默認(rèn)是時間戳,可以取消,同時需要設(shè)置要表現(xiàn)的時間格式  
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);  
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

3、常用注解

  1. @JsonIgnoreProperties(ignoreUnknown = true):

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

  1. @JsonIgnoreProperties({ “password”, “secretKey” }):

指定忽略字段

  1. @JsonIgnore:

標(biāo)在注解上,將忽略此字段

  1. @JsonFormat(timezone = “GMT+8”, pattern = “yyyy-MM-dd HH:mm:ss”):

標(biāo)在時間自端上序列化是使用制定規(guī)則格式化(默認(rèn)轉(zhuǎn)化成時間戳)

  1. @JsonInclude(參數(shù))

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

  1. @JsonProperty("firstName")

標(biāo)在字段上,指定序列化后的字段名

  1. @JsonDeserialize(using= T extends JsonDeserializer<FiledType>.class)和@JsonSerialize(using= T extends JsonSerializer<FiledType>.class)

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

四、最后

總結(jié)內(nèi)容

更多資源:其實是白羊

歡迎star

日常求贊

  • 如果你認(rèn)為本文對你有幫助,還請「在看/轉(zhuǎn)發(fā)/贊/star」,多謝
  • 如果你還發(fā)現(xiàn)了更好或不同的想法,還請在留言區(qū)不吝賜教,一起探討交流修改,萬分感謝

歡迎關(guān)注公眾號:「其實是白羊」干貨持續(xù)更新中......

[圖片上傳失敗...(image-e396e3-1585817742481)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. JSON 是什么 JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式...
    cbw100閱讀 529評論 0 3
  • 轉(zhuǎn)載自:https://www.ibm.com/developerworks/cn/java/jackson-ad...
    醬紫_Johns閱讀 1,647評論 0 4
  • 世人也說:“錢可以買到房屋,卻買不到溫暖;錢可以買到藥品,卻買不到健康;錢可以買到書本,卻買不到智慧;錢可以買到床...
    ec08e92700a4閱讀 463評論 0 0
  • 1 在紙的中心畫上主題。 2 主脈呈現(xiàn)放射狀,主脈從粗到細(xì)寫上第1個主要的概念標(biāo)題,以關(guān)鍵詞方式填寫,畫上線條...
    小英子_e2e4閱讀 361評論 0 0
  • 萱:奶奶的小寶貝,奶奶不能時刻陪在你身邊,可奶奶的心卻牽掛著你,每時每刻!看不到你的每一天,奶奶飽嘗了牽腸掛肚的滋...
    寒江雪810閱讀 169評論 0 0

友情鏈接更多精彩內(nèi)容