語法
com.fasterxml.jackson.databind.ObjectMapper
ObjectMapper mapper; 不要每次都new
如果在Spring
中直接注入使用。JsonNode
不能put
可以強轉objectNode
後操作。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;}
JSON 轉 POJO
String jsonStr = "{\"name\":\"張三\", \"age\":18}";
Npc npc = mapper.readValue(jsonStr, Npc.class);
System.out.print("json2obj:");System.out.println(npc);
POJO 轉 JSON
String obj2json = mapper.writeValueAsString(npc);
System.out.print("obj2json:");System.out.println(obj2json);
JSON 轉 list
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);
list 轉 JSON
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 的屬性。 | 類 |