Jackson 學習筆記

語法

  1. com.fasterxml.jackson.databind.ObjectMapper ObjectMapper mapper; 不要每次都new如果在Spring中直接注入使用。
  2. JsonNode不能put可以強轉objectNode後操作。
  3. objectNode添加內容時。基礎類型、包裝類用 put,自定義對象用set
方法 參數 返回 介紹
mapper.writeValueAsString 對象 json字符串
mapper.readValue jsonString, class 對象 用於知曉對象類型的場景
mapper.readValue jsonString, JavaType 字符串轉集合(結果要強轉)
mapper.readValue jsonString, TypeReference<T> 字符串轉集合
mapper.readTree json字符串 JsonNode 用於類型不明的場景

測試用對象

public class Npc { private String name;private Integer age;}

JSONPOJO

String jsonStr = "{\"name\":\"張三\", \"age\":18}";
Npc npc = mapper.readValue(jsonStr, Npc.class);

System.out.print("json2obj:");System.out.println(npc);

POJOJSON

String obj2json = mapper.writeValueAsString(npc);

System.out.print("obj2json:");System.out.println(obj2json);

JSONlist

String json2list = "[{\"name\":\"李四\",\"age\":13},{\"name\":\"王五\",\"age\":14},{\"name\":\"趙六\",\"age\":15},{\"name\":\"洪七\",\"age\":16},{\"name\":\"重八\",\"age\":17}]";

// 方案一:有缺陷結果需要強轉不好看
JavaType javaType = mapper.getTypeFactory().constructParametricType(ArrayList.class, Npc.class);
List<Npc> npcs = (List<Npc>) mapper.readValue(json2list, javaType);

System.out.print("json2list1:");System.out.println(npcs);

// 方案二:無需要強轉
TypeReference<List<Npc>> listTypeReference = new TypeReference<List<Npc>>(){};
List<Npc> npcs1 = mapper.readValue(json2list, listTypeReference);

System.out.print("json2list2:");System.out.println(npcs1);

listJSON

List<Npc> list = new ArrayList<Npc>();
list.add(new Npc("李四", 13));
list.add(new Npc("王五", 13));
list.add(new Npc("趙六", 13));
list.add(new Npc("洪七", 13));
list.add(new Npc("重八", 13));

String list2json = mapper.writeValueAsString(list);

System.out.print("list2json:");System.out.println(list2json);

手動構建json對象

還可以用 toPrettyString()輸出格式化json

ArrayNode jsonNodes = mapper.createArrayNode(); // 創建json數組
for (int i = 0; i < 10; i++) {
   ObjectNode objectNode = mapper.createObjectNode(); // 創建json對象
   objectNode.put("name", "角色" + i);
   jsonNodes.add(objectNode);
}

System.out.print("手動構建json對象:");
System.out.println(jsonNodes.toString());

at 按路徑取直接目標值


String jsonStr2 = "[{\"name\":\"張三\",\"age\":13},{\"name\":\"重八\",\"age\":18,\"friend\":{\"name\":\"洪七\",\"age\":17,\"friend\":{\"name\":\"趙六\",\"age\":16,\"friend\":{\"name\":\"王五\",\"age\":15}}}}]";
ArrayNode jsonNodes1 = mapper.readValue(jsonStr2, ArrayNode.class);

System.out.print("at按路徑取直接目標值:");
System.out.println(jsonNodes1.get(1).at("/friend/friend/friend/name"));

取值轉類型

jsonNodes1.get(1).at("/friend/name").getNodeType(); // STRING
jsonNodes1.get(1).at("/friend/agt").getNodeType(); // NUMBER
String name = jsonNodes1.get(0).get("name").asText(); // 取值並轉爲字符串類型
int age = jsonNodes1.get(0).get("age").asInt(); // 取值並轉爲數字類型

註解

註解 說明 用於
@JsonInclude(Include.NON_EMPTY) 字段爲null不序列化。 字段
@JsonIgnore 序列化時忽略此字段。 字段
@JsonProperty(value = “name”) 默認使用屬性名,此註解可以自己定義序列華的名字。 字段
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”) 設置時間格式。 字段
@JsonUnwrapped 把對象展平(消除層級放到同一級) 字段
@JsonIgnoreType 類註解,序列化時忽略此類。
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,property = “id”) 用於指示在序列化/反序列化值時可以正確地反序列化對單個Java對象的多個引用。用於處理循環對象引用。
@JsonPropertyOrder({“field1”, “field2”, “field2”}) 設置字段順序
@JsonIgnoreProperties({“field1”, “field2”}) 序列化時忽略“field1”, “field2” 兩個屬性。反序列化時忽略無Getter 和 Setter 的屬性。

參考資料

github: jackson-databind
github: jackson-annotations

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章