Jackson第一篇

时间:2022-07-26
本文章向大家介绍Jackson第一篇,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

基础准备

Spring中已引入jackson相关依赖,无须在pom中再引入相关依赖,若再引入相关依赖,则会报错创建bean异常。

使用

写一个PlayerStar的实体类,实体类主要体现篮球明星的名字、年龄、业余爱好、朋友、年收入等信息,为了尽可能地演示Jackson的序列化与反序列化功能,将数组、List、Map都融合到这个类里面。并通过getInstance初始化篮球明星Jordan这个对象。

@Data
public class PlayerStar {

  private String name;
  private Integer age;
  private String[] hobbies;    //业余爱好,数组
  private List<String> friends;   //  朋友
  private Map<String, BigDecimal> salary; //年收入 Map

  //初始化一个对象用于测试
  public static PlayerStar getInstance(){
    PlayerStar playerStar = new PlayerStar();

    playerStar.setName("乔丹");
    playerStar.setAge(45);
    playerStar.setHobbies(new String[]{"高尔夫球", "棒球"});
    Map<String, BigDecimal> salary = new HashMap<String, BigDecimal>() {{
      put("2000", new BigDecimal(10000000));
      put("2010", new BigDecimal(62000000));
      put("2020", new BigDecimal(112400000));
    }};
    playerStar.setSalary(salary);
    playerStar.setFriends(Arrays.asList("kobe", "curry", "james"));

    return playerStar;
  }

}

序列化方法

@Test
void testObject2JSON() throws IOException {
  //获取对象实例
  PlayerStar player = PlayerStar.getInstance();

  //ObjectMapper作为Jackson的API工具类存在
  ObjectMapper mapper = new ObjectMapper();
  //将player对象以JSON格式进行序列化,并将序列化结果写入文件
  mapper.writeValue(new File("d:datajacksonplayer.json"), player);

  //将player对象以JSON格式进行序列化为String对象
  String jsonString = mapper.writeValueAsString(player);
  System.out.println(jsonString);

  //将player对象以JSON格式进行序列化为String对象(格式美化)
  String jsonInString2 = mapper.writerWithDefaultPrettyPrinter()
          .writeValueAsString(player);
  System.out.println(jsonInString2);
}

反序列化方法

@Test
void testJSON2Object() throws IOException {
  ObjectMapper mapper = new ObjectMapper();
  //从文件中读取JSON字符串,反序列化为java对象
  PlayerStar player = mapper.readValue(new File("d:datajacksonplayer.json"), PlayerStar.class);
  System.out.println(player);

  //将JSON字符串反序列化为java对象
  String jsonInString = "{"name":"乔丹","age":45,"hobbies":["高尔夫球","棒球"]}";
  PlayerStar jordan = mapper.readValue(jsonInString, PlayerStar.class);

  System.out.println(jordan);

}

字段重命名

可以使用 @JsonProperty来影响序列化和反序列化对象属性的重命名。

@Data
public class PlayerStar {

  @JsonProperty("playerName")
  private String name;  //将属性name序列化为playerName,同时影响反序列化
String jsonInString = "{"name":"乔丹","age":45,"hobbies":["高尔夫球","棒球"]}";
PlayerStar jordan = mapper.readValue(jsonInString, PlayerStar.class);