一文搞定Jackson解析JSON數據


一文搞定Jackson解析JSON數據


一、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依賴引入

<code><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>
/<code>

2、基本使用

反序列化

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

運行結果:

<code>TestBean(id=1, name=haha, elements=[Element(age=1, elName=zll), Element(age=2, elName=zll1)])/<code>
  1. 使用ObjectMapper,讀取json某些字段值
<code>        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);/<code>

運行結果:

<code>haha
2/<code>

序列化

  1. ObjectMapper(將JavaObject轉化成JSON)
<code>Element element = new Element();
element.setAge(1);
element.setElName("zll");
ObjectMapper objectMapper = new ObjectMapper();
String elementStr = objectMapper.writeValueAsString(element);
System.out.println(elementStr);/<code>

輸出結果如下:

<code>{"age":1,"elName":"zll"}/<code>

其他常用序列化方法:

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

<code>        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);/<code>

執行結果:

<code>{"name":"value","numberName":1,"ObjectName":"ObjectValue","arrayName":["element1",1,1]}/<code>

2、ObjectMapper的常用設置

<code>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"));/<code>

3、常用註解

  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) 自定義某些類型字段的序列化與反序列化規則


作者:其實是白羊
鏈接:https://juejin.im/post/5e85a4c36fb9a03c5d5c7576


分享到:


相關文章: