千家信息网

JSON数据处理框架Jackson中序列化与反序列化核心用法是什么

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,JSON数据处理框架Jackson中序列化与反序列化核心用法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Jackson是Sp
千家信息网最后更新 2025年02月01日JSON数据处理框架Jackson中序列化与反序列化核心用法是什么

JSON数据处理框架Jackson中序列化与反序列化核心用法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库。有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制。它提供了很多的JSON数据处理方法、注解,也包括流式API、树模型、数据绑定,以及复杂数据类型转换等功能。它虽然简单易用,但绝对不是小玩具,下面为大家介绍Jackson的基础核心用法。

一、基础准备

在任意项目中引入下面的jar就可以使用jackson进行JSON的数据序列化与反序列化的功能。

        com.fasterxml.jackson.core        jackson-databind        2.9.8

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

[@Data](https://my.oschina.net/difrik)public class PlayerStar {  private String name;  private Integer age;  private String[] hobbies;    //业余爱好,数组  private List friends;   //  朋友  private Map salary; //年收入 Map  //初始化一个对象用于测试  public static PlayerStar getInstance(){    PlayerStar playerStar = new PlayerStar();    playerStar.setName("乔丹");    playerStar.setAge(45);    playerStar.setHobbies(new String[]{"高尔夫球", "棒球"});    Map salary = new HashMap() {{      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;  }}

二、序列化方法

下面代码演示了如何将PlayerStar对象序列化为JSON字符串。

  • writeValue可以接收File作为参数,将JSON序列化结果保存到文件中

  • writeValueAsString将JSON序列化结果以String形式返回

  • writerWithDefaultPrettyPrinter方法可以将JSON序列化结果进行格式化,更好的显示结构,易于查看

[@Test](https://my.oschina.net/azibug)void testObject2JSON() throws IOException {  //获取对象实例  PlayerStar player = PlayerStar.getInstance();  //ObjectMapper作为Jackson的API工具类存在  ObjectMapper mapper = new ObjectMapper();  //将player对象以JSON格式进行序列化,并将序列化结果写入文件  mapper.writeValue(new File("d:\\data\\jackson\\player.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);}

jsonString的控制台打印输出结果,也是d:\data\jackson\player.json文件的内容

{"name":"乔丹","age":45,"hobbies":["高尔夫球","棒球"],"friends":["kobe","curry","james"],"salary":{"2000":10000000,"2010":62000000,"2020":112400000}}

jsonString2的控制台打印输出,格式进行了美化,因为使用了writerWithDefaultPrettyPrinter()方法

{  "name" : "乔丹",  "age" : 45,  "hobbies" : [ "高尔夫球", "棒球" ],  "friends" : [ "kobe", "curry", "james" ],  "salary" : {    "2000" : 10000000,    "2010" : 62000000,    "2020" : 112400000  }}

三、反序列化方法

下面代码演示了如何将JSON字符串反序列化为Java对象

[@Test](https://my.oschina.net/azibug)void testJSON2Object() throws IOException {  ObjectMapper mapper = new ObjectMapper();  //从文件中读取JSON字符串,反序列化为java对象  PlayerStar player = mapper.readValue(new File("d:\\data\\jackson\\player.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);}

PlayerStar对象控制台输出结果如下(注意这里的输出不是JSON格式,而是java对象的toString()方法值):

PlayerStar(name=乔丹, age=45, hobbies=[高尔夫球, 棒球], friends=[kobe, curry, james], salary={2000=10000000, 2010=62000000, 2020=112400000})PlayerStar(name=乔丹, age=45, hobbies=[高尔夫球, 棒球], friends=null, salary=null)

四、字段重命名 @JsonProperty

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

[@Data](https://my.oschina.net/difrik)public class PlayerStar {  @JsonProperty("playerName")  private String name;  //将属性name序列化为playerName,同时影响反序列化

使用上面代码的注解之后,JSON序列化的结果name属性变成playerName属性

{"playerName":"乔丹"  ……

同时影响反序列化,下面的反序列化代码会报错,因为使用了name属性。应该使用playerName才可以。

String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";PlayerStar jordan = mapper.readValue(jsonInString, PlayerStar.class);

五、忽略null字段的序列化@JsonInclude

当我们不为对象的成员变量赋值的时候,默认情况下,Jackson的序列化结果是下面的这样的。

{  "age" : 45,  "hobbies" : null,  "friends" : null,  "salary" : null,  "playerName" : "乔丹"}

如果我们不希望将null值,体现在JSON序列化结果中,我们可以使用下面的方法。如果希望在某次序列化的全局范围内,忽略null成员变量,可以使用下面的API

ObjectMapper mapper = new ObjectMapper();mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

或者是在类名的上面加上如下注解。该注解将针对类里面的所有成员变量生效,只要成员变量为null,将不会被包含在序列化结果中。

@JsonInclude(JsonInclude.Include.NON_NULL)public class PlayerStar {   ......}

如果我们想针对PlayerStar类里面某些成员变量单独忽略null,可以在成员变量上面加注解。

@JsonInclude(JsonInclude.Include.NON_NULL)private String[] hobbies;    //业余爱好,数组@JsonInclude(JsonInclude.Include.NON_NULL)private List friends;   //  朋友@JsonInclude(JsonInclude.Include.NON_NULL)private Map salary; //年收入 Map

忽略为null的成员变量后,JSON序列化结果是下面这样的

{  "age" : 45,  "playerName" : "乔丹"}

六、忽略指定的字段

默认情况下,jackson不会将static和transient的成员变量进行序列化与反序列化操作。我们还可以通过

  • @JsonIgnore加在类成员变量上面,该成员变量将被排除在序列化和反序列化的过程之外

  • @JsonIgnoreProperties加在类声明上面,指定该类里面哪些字段被排除在序列化和反序列化的过程之外

上面的两种注解选其一即可,下面的代码两种注解我都用了,功能是重复的

@Data@JsonIgnoreProperties({"hobbies", "friends","salary"})public class PlayerStar {  @JsonProperty("playerName")  private String name;  private Integer age;  @JsonIgnore  private String[] hobbies;    //业余爱好,数组  @JsonIgnore  private List friends;   //  朋友  @JsonIgnore  private Map salary; //年收入 Map......

在类或成员变量上面加上注解之后,序列化结果如下,指定字段被忽略。

{  "age" : 45,  "playerName" : "乔丹"}

需要注意的是这两个注解不只是影响序列化为JSON字符串的过程,也影响JSON字符串反序列化为java对象的过程。举例:如果JSON字符串包含了类中被JsonIgnore的属性值hobbies,不会被反序列化赋值给java对象的成员变量hobbies。

关于JSON数据处理框架Jackson中序列化与反序列化核心用法是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

序列 对象 变量 成员 结果 乔丹 注解 方法 数据 字符 字符串 格式 棒球 面的 高尔夫球 高尔 属性 代码 字段 影响 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 一流网络安全学院建设示范 云服务器远程管理软件 软件开发好了找谁投资 互联网大厂和银行科技子公司 移动软件开发技术什么意思 软件开发费用处理 网络安全法向未成年人提供 上海网络安全教育平台 上海宝互联网科技有限公司 亚马逊云服务器怎么用 双阳区有名的网络技术服务有哪些 2008服务器安全批处理 三调数据库建设中的遇到的问题 ping连不上sql数据库 为什么要坚持网络安全 泉州软件开发有限公司招聘 网络安全管理架构 牡丹江软件开发公司 小程序的服务器配置 正在与孤岛惊魂6服务器进行连接 湖北省网络安全中心 昆明童程童美教育与软件开发 网络安全自救措施 考研读软件开发 广电网络技术部主任竞聘书 海南深圳网络安全培训就业前景好 浅谈网络安全策略 形容软件开发成语 ps5 战地一ea服务器连不上 我国常出现的网络安全问题
0