【问题标题】:Custom BigInteger JSON serializer自定义 BigInteger JSON 序列化程序
【发布时间】:2019-05-07 21:54:57
【问题描述】:

我正在尝试实现自定义 JSON 序列化程序类以在 JSON 响应中将对象 BigInteger 值显示为字符串。

我已经实现了一个自定义序列化程序类

public class CustomCounterSerializer extends StdSerializer<BigInteger> {

    private static final long serialVersionUID = 5440920327083673598L;

    public CustomCounterSerializer() {
        this(BigInteger.class);
    }

    public CustomCounterSerializer(Class<BigInteger> vc) {
        super(vc);
    }

    @Override
    public void serialize(BigInteger value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException {
        BigInteger valueJson = value==null ? BigInteger.valueOf(0) : value;
        jsonGenerator.writeString(valueJson.toString());
    }
}

我遇到的问题是我想使用重写的方法处理 null 对象值并将 0 传递给 JSON 字符串而不是 null

我为此编写了一个 JUnit 测试:

public class CustomCounterSerializerTest {

    private ObjectMapper objectMapper = new ObjectMapper();

    @After
    public void tearDown() {
        objectMapper = null;
    }

    @Test
    public void testCustomSerializerWithNullValues() throws JsonParseException, JsonMappingException, IOException {
        MyObject obj = new MyObject();
        obj.setNonNullValue(BigInteger.valueOf(1);
        String obj_ = objectMapper.writeValueAsString(obj);
        assertThat(obj_).isNotNull();
        assertTrue(obj_.contains("\"nonNullValue\":\"" + BigInteger.valueOf(1).toString() + "\",\"nullValue\":\""+ BigInteger.valueOf(0).toString() +"\""));
    }

}

失败,因为它包含 null 而不是 nullValue:"0"

但是对象的 null 值总是没有 args 构造函数,甚至像 this(BigInteger.class) 一样不使用我的方法并打印 null

【问题讨论】:

  • 旁注:您不应该假设字段按特定顺序序列化。
  • 我正在使用@JsonSerialize 并将类指定为该属性的序列化程序。我不假设顺序。我想要根据值的行为。
  • 您的断言在 nullValue 之前需要 nonNullValue

标签: java spring jackson objectmapper


【解决方案1】:

你需要告诉 Jackson 它应该使用你的序列化器 即使是空值。您可以使用 @JsonSerializer 来执行此操作 也可以使用nullsUsing 参数。

在您的 MyObject 类中,它看起来像这样:

@JsonSerialize(using = CustomCounterSerializer.class,
               nullsUsing = CustomCounterSerializer.class)
private BigInteger nullValue;

【讨论】:

    猜你喜欢
    • 2021-09-21
    • 2011-02-25
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多