自定义 BigInteger JSON 序列化程序

Custom BigInteger JSON serializer

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

我已经实现了自定义序列化程序 class

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 值总是没有参数构造函数,甚至像 this(BigInteger.class) 不使用我的方法并打印 null.

你需要告诉 Jackson 它应该使用你的序列化器 即使是空值。您可以使用 @JsonSerializer 还带有 nullsUsing 参数。

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

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