`
darrenzhu
  • 浏览: 807260 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jackson自定义序列化和反序列化

    博客分类:
  • Java
阅读更多

原文链接:https://blog.csdn.net/liuxiao723846/article/details/42921333

new way reference
https://blog.csdn.net/z69183787/article/details/79317443
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 {
    ...
}

分享到:
评论

相关推荐

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

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

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

    标题中的“jackson库实现定制化的java序列化反序列化操作”指的是利用Jackson库的能力,通过自定义规则来控制对象的序列化和反序列化过程。这通常涉及到创建自定义的`JsonSerializer`和`JsonDeserializer`,或者使用...

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

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

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

    此外,FastJson还支持JSON到Java的映射配置,可以自定义字段的序列化和反序列化规则。 2. Gson: Gson是Google提供的一个开源项目,用于在Java对象和JSON数据之间进行映射。Gson可以将任何Java对象转换成对应的...

    springboot-jackson-auto-transform-enum.zip

    Jackson自定义序列化和反序列化是提高灵活性和控制JSON转换过程的关键功能。当涉及到枚举类型(enum)时,这种定制尤其重要,因为默认的序列化方式可能不满足所有业务需求。 1. **Jackson库**:Jackson是Java领域最...

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

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

    Java Json序列化与反序列化

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

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

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

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

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

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

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

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

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

    Jackson进行json序列化

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

    Json序列化与反序列化详解

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

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

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

    Json反序列化

    JSON(JavaScript Object ...了解和掌握JSON反序列化的原理、常见库以及注意事项,对于提升开发效率和保证代码质量具有积极意义。在实际工作中,应根据项目需求选择合适的反序列化库,并编写测试用例确保其正确性。

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

    3. **类型安全的反序列化**:Jackson提供了类型令牌(`TypeReference`)或自定义类型解析器(`JsonDeserializer`),以确保反序列化时保持类型安全,尤其是在处理复杂数据结构时。 4. **流式API**:除了基于树模型...

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

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

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

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

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

    对于Java对象,推荐使用高效的JSON序列化库,如Jackson或Gson,它们支持配置以优化性能和数据大小。同时,确保在配置`RedisTemplate`时,为key和value指定适当的序列化器,避免使用默认配置,以防止潜在问题。 总之...

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

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

Global site tag (gtag.js) - Google Analytics