jackson中的自定义反序列化入门
最后修改:2019年12月24日
1.概述
这个快速教程将说明如何使用Jackson 2反序列化JSON使用自定义Deserializer.。
如果你想深入挖掘和学习你可以用杰克逊2做其他很酷的事情-往前走主要的Jackson教程。
进一步阅读:
2.标准反序列化
让我们从定义两个实体开始,看看Jackson将如何在没有任何定制的情况下将这些实体的JSON表示反序列化:
public class User {public int id;公共字符串名称;} public class Item {public int id;公共字符串itemName;公共用户所有者;}
现在,让我们定义我们想要反序列化的JSON表示:
{" id ": 1、“itemName”:“高新区”、“老板”:{" id ": 2,“名字”:"使用"}}
最后,让我们将这个JSON解联到Java实体:
Item itemWithOwner = new ObjectMapper()。readValue (json, Item.class);
3.定制的串并转换器objectmap
在前面的例子中,JSON表示与java实体完美匹配——接下来,我们将简化JSON:
{" id ": 1、“itemName”:“高新区”、“createdBy”:2}
当将其解组到完全相同的实体时-默认情况下,这当然会失败:
(3个已知的属性:“id”,“owner”,“itemName”))金宝搏188体育[电子邮件受保护]c7a917;line: 1, column: 43](通过引用链:org.baeldun .jackson.dto金宝搏188体育s. item ["createdBy"])
我们通过做来解决这个问题我们自己的反序列化与自定义反序列化器:
公共类itemdeserializer扩展了stddeserializer - {public itemdeserializer(){this(null);公共项目Deserializer(类<?> VC){Super(VC);@Override公共项目deserialize(jsonparser jp,deserializationcontext ctxt)抛出ioException,jsonprocessingException {jsonnode node = jp.getcodec()。ReadTree(JP);int id =(整数)((intnode)node.get(“ID”))。numberValue();String itemname = node.get(“itemname”)。astext();int userid =(整数)((intnode)node.get(createdBy“))。numberValue();返回新项目(ID,ItemName,New User(UserId,Null));}}
如您所见,反序列化器正在使用JSON的标准Jackson表示JsonNode。一旦输入JSON表示为JsonNode,我们现在可以从中提取相关信息构建我们自己的项实体。
简单地说,我们需要注册此自定义Deserializer并简单地反序列化JSON:
ObjectMapper = new ObjectMapper();SimpleModule模块= new SimpleModule();module.addDeserializer (Item.class,新的ItemDeserializer ());mapper.registerModule(模块);Item readValue = mapper。readValue (json, Item.class);
4.在类上自定义反序列化器
或者,我们也可以直接在类上注册反序列化器:
@ jsondeserializer (using = ItemDeserializer.class) public class itemdeserializer{…}
在类级别定义的反序列化器,就不需要在objectmap-一个默认的映射器会很好:
Item itemWithOwner = new ObjectMapper()。readValue (json, Item.class);
这种类型的每个类配置在我们可能无法直接访问原始数据的情况下非常有用objectmap配置。
5.结论
本文展示了如何利用Jackson 2读取非标准JSON输入- 以及如何将其输入到任何Java实体图表,并完全控制映射。
实现所有这些示例和代码片段可以在在github上- 它是一个基于Maven的项目,因此应该易于导入和运行。