`

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

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

先是对象:
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: java.io.StringReader@53c7a917; 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 {
    ...
}

 
5
1
分享到:
评论
5 楼 907121461 2014-08-08  
我的 jackson jar 怎么没有registerModule这个方法呢
4 楼 liuweihug 2014-08-01  
json序列化反序列化插件-json2.js 介绍和使用
http://www.suchso.com/UIweb/json2-js-stringify-parse-serializable-deserialize.html
3 楼 jackyrong 2014-01-17  
sootv 写道
请问下jackson可以生成这种格式不,标准json格式是{key1:value1,key2:value2},而我只要value,如{value1,value2}


可以的,参考:http://jackyrong.iteye.com/blog/1936581
2 楼 sootv 2014-01-16  
请问下jackson可以生成这种格式不,标准json格式是{key1:value1,key2:value2},而我只要value,如{value1,value2}
1 楼 shmily2038 2014-01-16  
{ 
    "id": 1, 
    "itemName": "theItem", 
  [b]  "owner": { 
        "id": 2, 
        "name": "theUser" 
    } [/b]
} 

  如果要输出为如下的样子,比如; 
{ 
    "id": 25, 
    "itemName": "FEDUfRgS", 
    [b]"owner": 15 [/b]
}


刚开始看,看不出两者的关系。。。。。

相关推荐

    jackson库实现定制化的java序列化反序列化操作

    Jackson库是Java开发中常用的序列化和反序列化工具,主要处理JSON数据,但也支持XML。这个库由FasterXML公司开发,旨在提供高性能、易用性以及灵活性。在Java应用中,序列化是将对象转换为可传输或存储的格式(如...

    jackson json序列化,反序列化所需jar包

    在实际开发中,你可能还需要配置`ObjectMapper`以满足特定需求,比如日期格式化、忽略未知属性、自定义序列化策略等。这可以通过设置`ObjectMapper`的配置属性或者使用注解来实现。 为了在项目中使用这些jar包,你...

    实例解析Json反序列化之ObjectMapper(自定义实现反序列化方法)

    通过自定义反序列化方法,我们可以灵活地处理各种复杂的数据映射需求,将JSON数据准确无误地转换成Java对象,以供后端业务逻辑处理。这一过程不仅涉及到Java反射机制的运用,同时也需要对JSON格式有深入的理解。对于...

    fastJosn Gson Jackson 序列化和反序列化所需要的jarlib.rar

    在Java开发中,序列化和反序列化是数据转换的重要环节,主要用于将对象转换为可存储或传输的数据格式,如JSON字符串,以及将这些数据还原为原来的对象。本压缩包包含fastJson、Gson和Jackson这三种流行JSON库的jar...

    序列化与反序列化经典例子

    4. **自定义序列化**:有时,我们可能希望对序列化过程有更精细的控制,比如忽略某些字段或使用特定的序列化策略。这时可以实现`writeObject()`和`readObject()`方法来自定义序列化行为。 5. **序列化框架**:除了...

    Java Json序列化与反序列化

    三、自定义序列化与反序列化 在某些情况下,我们可能需要对特定的字段或对象进行自定义处理。Jackson和Gson都提供了这样的功能: - Jackson中的`@JsonSerialize`和`@JsonDeserialize`注解可以指定自定义的序列化器...

    SpringBoot中时间类型序列化、反序列化、格式处理.docx

    4. **自定义序列化器和反序列化器**: - `LocalDateTimeSerializer`和`LocalDateSerializer`以及`LocalTimeSerializer`都是Jackson的`JsonSerializer`和`JsonDeserializer`的子类,它们分别用于序列化和反序列化`...

    fastjson、gson、jackson序列化和反序列化所用 json

    Jackson还支持注解驱动的映射,允许开发者通过注解来控制序列化和反序列化的具体行为。 这三个库各有特点,Fastjson以其速度和简洁性脱颖而出,Gson则以其灵活性和对复杂类型的处理能力受到青睐,而Jackson则在功能...

    序列化工具(Gson, Jackson, FastJson, ProtoBuf)

    它的使用简单,支持复杂的类型转换,包括泛型、枚举、自定义序列化和反序列化策略。Gson的优势在于其灵活性和强大的类型处理能力,使得它在处理JSON数据时非常便捷。 2. Jackson(FasterXML Jackson): Jackson是...

    jackson 使用方法(序列化效率很高)

    Jackson是Java领域中广泛使用的JSON处理库,以其高效、灵活的序列化和反序列化功能而闻名。在本文中,我们将深入探讨Jackson的使用方法,尤其是它在序列化效率方面表现出的优势。 首先,Jackson的核心组件包括`...

    Java安全漫谈 - 07.反序列化篇(1)1

    2. **脆弱的自定义序列化**:在`readObject`方法中直接执行未经验证的用户输入,可能导致代码执行。 3. **反射滥用**:攻击者可以通过序列化数据控制反射调用,执行敏感方法或构造对象。 4. **第三方库的不安全实现*...

    Jackson进行json序列化

    Jackson是Java领域中广泛使用的JSON处理库,它提供了高效的序列化和反序列化功能,能够将Java对象转换为JSON格式的字符串,同时也能将JSON数据转换回Java对象。在这个小例子中,我们将深入探讨如何使用Jackson进行...

    Json序列化与反序列化详解

    本文将深入探讨JSON的序列化与反序列化过程,以及如何使用Gson、FastJson和Jackson这三种流行的Java库来实现这一功能。 一、什么是JSON序列化与反序列化? 1. JSON序列化:序列化是指将Java对象转换为JSON字符串的...

    SpringBoot中时间类型 序列化、反序列化、格式处理.docx

    在`JacksonCustomizerConfig`类中,通过`@Value`注解读取配置文件中的日期格式,然后使用`Jackson2ObjectMapperBuilderCustomizer`来定制`Jackson`的配置,为特定的日期时间类型设置自定义的序列化和反序列化器。...

    Json反序列化

    3. 处理异常:在转换过程中,如果JSON格式有误,反序列化库会抛出异常,需要捕获并处理。 五、JSON反序列化的注意事项 1. 数据类型匹配:确保JSON中的数据类型与目标语言的数据类型相匹配,例如JSON中的数字在...

    动态调用webservice与复杂对象的序列化

    3. 自定义序列化和反序列化逻辑:对于特殊类型的对象,可能需要提供自定义的序列化和反序列化逻辑。 4. 错误处理:在处理序列化和反序列化时,必须捕获和处理可能出现的异常,如格式错误、类型不匹配等。 在实际...

    支持javax.money数据类型的JSON序列化和反序列化

    Jackson是Java生态系统中最流行的JSON库之一,提供了高效的序列化和反序列化功能。然而,标准的Jackson库并未直接支持Java的`javax.money`货币类型,这使得处理这类数据时需要额外的适配。 `Jackson-datatype-money...

    redis使用过程中由于序列化工具引起的问题

    然而,在实际使用过程中,由于序列化工具的选择和配置不当,可能会引发一系列问题。这篇博客讨论的就是这类问题,特别是如何理解和解决由序列化工具导致的困扰。 在Redis中,当我们存储复杂的数据结构,如Java对象...

    Java对象的序列化与反序列化Java开发Java经验技巧

    - **只序列化需要的部分**:通过`writeObject()`和`readObject()`方法自定义序列化和反序列化过程,避免序列化整个对象,提高效率。 - **流式序列化**:使用`ObjectStreamClass`和`ObjectStreamConstants`类,可以...

    序列化工具jackson

    Jackson提供了丰富的注解,用于自定义序列化和反序列化的规则。例如,`@JsonProperty`用于指定字段与JSON属性的映射,`@JsonIgnore`用于忽略某个字段,`@JsonFormat`用于控制日期和时间的格式等。 ```java public ...

Global site tag (gtag.js) - Google Analytics