jackson中自定义处理序列化和反序列化

http://jackyrong.iteye.com/blog/2005323

**********************************************

对于一直用gson的人来说,如果单独用jackson,真是麻烦了,但还是得小结下了:
先来看下如何自定义把某个对象序列化为json:

先是对象:

Java代码

    public class User {
        public int id;
        public String name;
    }
    public class Item {
        public int id;
        public String itemName;
        public User owner;
    }  

JACKSON一般的使用很容易,如;

Item myItem = new Item(1, "theItem", new User(2, "theUser"));
String serialized = new ObjectMapper().writeValueAsString(myItem); 

结果为:

{
    "id": 1,
    "itemName": "theItem",
    "owner": {
        "id": 2,
        "name": "theUser"
    }
} 

如果要输出为如下的样子,比如;

{
    "id": 25,
    "itemName": "FEDUfRgS",
    "owner": 15
} 

则要自定义了,要继承JsonSerializer类,如下:

    public class ItemSerializer extends JsonSerializer<Item> {
        @Override
        public void serialize(Item value, JsonGenerator jgen, SerializerProvider provider)
          throws IOException, JsonProcessingException {
            jgen.writeStartObject();
            jgen.writeNumberField("id", value.id);
            jgen.writeStringField("itemName", value.itemName);
            jgen.writeNumberField("owner", value.owner.id);
            jgen.writeEndObject();
        }
    }  

然后

    Item myItem = new Item(1, "theItem", new User(2, "theUser"));
    ObjectMapper mapper = new ObjectMapper();  

    SimpleModule module = new SimpleModule();
    module.addSerializer(Item.class, new ItemSerializer());
    mapper.registerModule(module);  

    String serialized = mapper.writeValueAsString(myItem);  

看,相当复杂,然后看有无办法简单点,其实是有的哦;方法为:

@JsonSerialize(using = ItemSerializer.class)
public class Item {
    ...
} 

就是使用注解@JsonSerialize,然后:

    Item myItem = new Item(1, "theItem", new User(2, "theUser"));
    String serialized = new ObjectMapper().writeValueAsString(myItem);  

接下来看如何反序列化了,
同样,要反序列化的两个pojo为:

    public class User {
        public int id;
        public String name;
    }
    public class Item {
        public int id;
        public String itemName;
        public User owner;
    }  

反序列化代码为:

Item itemWithOwner = new ObjectMapper().readValue(json, Item.class); 

如果要自定义反序列化,比如要反序列化的JSON为;

{
    "id": 1,
    "itemName": "theItem",
    "owner": 2
} 

则上面这样会报错:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:

Unrecognized field "createdBy" (class org.baeldung.jackson.dtos.Item),

not marked as ignorable (3 known properties: "id", "owner", "itemName"])

at [Source: [email protected]; line: 1, column: 43]

(through reference chain: org.baeldung.jackson.dtos.Item["createdBy"])

代码:

    public class ItemDeserializer extends JsonDeserializer<Item> {  

        @Override
        public Item deserialize(JsonParser jp, DeserializationContext ctxt)
          throws IOException, JsonProcessingException {
            JsonNode node = jp.getCodec().readTree(jp);
            int id = (Integer) ((IntNode) node.get("id")).numberValue();
            String itemName = node.get("itemName").asText();
            int userId = (Integer) ((IntNode) node.get("id")).numberValue();  

            return new Item(id, itemName, new User(userId, null));
        }
    }  

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addDeserializer(Item.class, new ItemDeserializer());
    mapper.registerModule(module);  

    Item readValue = mapper.readValue(json, Item.class);  

也可以用注解:

@JsonDeserialize(using = ItemDeserializer.class)
public class Item {
    ...
} 

原文地址:https://www.cnblogs.com/zhao1949/p/8427524.html

时间: 2024-10-21 21:44:36

jackson中自定义处理序列化和反序列化的相关文章

ASP.NET 中JSON 的序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介: JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号''{}'

ASP.NET中JSON的序列化和反序列化

ASP.NET中JSON的序列化和反序列化 JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理.     一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是

Asp.Net中JSON的序列化和反序列化-----JavaScriptSerializer ,加上自己工作心得

在工作中和手机通信用到web服务和javascriptSerializer,返回json数据,供手机端调用,一开始返回的数据是一大堆,比如 [{"word_picture9":"http://boss.xbxw.net/Upload/word/guojia/p_yinggelan.jpg","word_picture8":"http://boss.xbxw.net/Upload/word/guojia/p_zhongguo.jpg&qu

[转]ASP.NET中JSON的序列化和反序列化

本文转自:http://www.cnblogs.com/zhaozhan/archive/2011/01/09/1931340.html JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理.     一.JSON简介 JSON(JavaScript Objec

Asp.net中Json的序列化和反序列化(一)

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理.     一.JSON简介 JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是“名值对”的集合.结构由大括号'{}',中括

Python 中数据的序列化和反序列化(json处理)

概念: JSON(JavaScript Object Notation):是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等). 这些

java中对象的序列化和反序列化

[对象的序列化和反序列化 ] 1.定义:序列化--将对象写到一个输出流中.反序列化则是从一个输入流中读取一个对象.类中的成员必须是可序列化的,而且要实现Serializable接口,这样的类的对象才能被序列化和反序列化.这个接口是一个表示型的接口.serialVersionUID是一个串行化类的通用标示符,反串行化就是使用这个标示符确保一个加载的类对应一个可串行化的对象. 自己指定了serialVersionUID,就可以在序列化后,去添加一个字段,或者方法,而不会影响到后期的还原,还原后的对象

MessagePack Java Jackson Dataformat - POJO 的序列化和反序列化

在本测试代码中,我们定义了一个 POJO 类,名字为 MessageData,你可以访问下面的链接找到有关这个类的定义. https://github.com/cwiki-us-demo/serialize-deserialize-demo-java/blob/master/src/main/java/com/insight/demo/serialize/model/msgpack/MessageData.java POJO 的序列化和反序列化 你仅仅需要对 MessagePackFactory

C#中怎样实现序列化和反序列化

我们想要将数据进行持久化的操作的话,也就是将数据写入到文件中,我们在C#中可以通过IO流来操作,同时也可以通过序列化来操作,本人是比较推荐使用序列化操作的 因为我们如果想要将一个对象持久化到文件中 如果我们使用IO流文件流操作的话可能就没办法实现了,但是我们用序列化的话就可以轻而易举的实现,并且当我们回拿到数据的 时候,我们拿到的也是一个对象,但是它保存到文件中是二进制文件 具体实现步骤如下 首先我们有一个实体对象  并且这个类是可支持序列化操作的  也就是挂载有[Serializable]标记