NO IMAGE

Jackson用法

Spring Boot 預設整合使用了Jackson,既然是SpringBoot的選擇,那麼肯定有其過人的優勢。所以,這邊簡單記錄下Jackson的用法。方法自己日用複習使用,記錄的比較簡單,歡迎留貼討論。

1.Java pojo實體類

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Pet {
private String name;
private Integer age;
}
@Data
public class People {
private String name;
private int age;
private boolean isAdult;
private double salary;
private Date birthday;
private List<Pet> pets;
private Map<String,String> others;
}
public class PeopleFactory {
public static People getPeople() throws ParseException {
People people=new People();
people.setName("張三");
people.setAge(26);
people.setAdult(true);
people.setSalary(7800.12);
people.setBirthday(DateUtils.parseDate("1993-08-08 18:18:18","yyyy-MM-dd HH:mm:ss"));
people.setPets(Arrays.asList(new Pet("小黃",1),new Pet("小藍",2)));
Map<String,String> map=new HashMap<>();
map.put("愛好","下棋");
map.put("女友","小美");
people.setOthers(map);
return people;
}
}

2.Java物件轉json字串

2.1簡單轉換成字串格式輸出
public static void main(String[] args) throws Exception {
People people = PeopleFactory.getPeople();
//jackson的核心,通過mapper來進行序列化和反序列化
ObjectMapper mapper=new ObjectMapper();
//序列化,write相關方法!write可以是序列化輸出多種格式,當然這邊最常用就是寫成為String返回前端
String jsonStr1 = mapper.writeValueAsString(people);
System.out.println(jsonStr1);
System.out.println("===============================================================");
//設定序列化後的格式,INDENT_OUTPUT表示縮排輸出,true表示試該配置生效
mapper.configure(SerializationFeature.INDENT_OUTPUT,true);
String jsonStr2 = mapper.writeValueAsString(people);
System.out.println(jsonStr2);
}

2.2帶有jackson註解的javabean序列化
上面的實體類中這兩個屬性新增註解
@JsonProperty(value = "myName")
private String name;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;

再看輸出:

其他註解參考:https://github.com/FasterXML/jackson-annotations/wiki/Jackson-Annotations

3.Json轉java物件

主要掌握ObjectNode和ArrayNode的相關方法就可以了。有點類似以前的dom樹

public static void main(String[] args) throws Exception {
String json = "{\"age\":26,\"salary\":7800.12,\"birthday\":\"1993-08-08 10:18:18\",\"pets\":[{\"name\":\"小黃\",\"age\":1},{\"name\":\"小藍\",\"age\":2}],\"others\":{\"愛好\":\"下棋\",\"女友\":\"小美\"},\"adult\":true,\"myName\":\"張三\"}";
ObjectMapper mapper = new ObjectMapper();
//反序列化都是ObjectMapper.read相關方法
//第一種方式,如果有對應的javaBean接收,可以這樣,直接做
People people = mapper.readValue(json, People.class);
System.out.println(people);
//第二種方式,如果沒有對應的javaBean接收,可以用ObjectNode接收
ObjectNode objectNode = mapper.readValue(json, ObjectNode.class);
//jackson中json物件就是一個個node
//查詢node和值得幾種方式區別
/*
* 1.findValue   從當前節點開始查詢子孫節點,只要有匹配的節點就返回該節點否則返回null
* 2.get         僅查詢當前節點是否有匹配的節點
* 3.with        僅查詢當前節點是否有匹配的節點,若有,則該節點必須是ObjectNode,若無,則自動建立一個
* 4.withArray   僅查詢當前節點是否有匹配的節點,若有,則該節點必須是ArrayNode,若無,則自動建立一個
*/
objectNode.findValue("女友");
objectNode.get("pets");
objectNode.with("others");
objectNode.withArray("pets");
//ObjectNode節點資料的新增
//因為objectNode沒有"myNode"節點,
// 所有當呼叫objectNode.with("myNode")自動就新增了該節點,然後我們可以往該節點裡面新增資料
ObjectNode myNode = objectNode.with("myNode");
myNode.put("key1", "value1");
myNode.put("key2", 19.9);
//ArrayNode節點資料的新增
ArrayNode myArrayNode = objectNode.withArray("myArrayNode");
myArrayNode.add("");
//新增一個ObjectNode,然後又往這個ObjectNode裡面放東西。
ObjectNode jsonNodes = myArrayNode.addObject();
//。。。。等等方法。
}