Пользовательский сериализатор BigInteger JSON - PullRequest
0 голосов
/ 06 декабря 2018

Я пытаюсь реализовать пользовательский класс сериализатора JSON для отображения значений объекта BigInteger в виде строки в ответе JSON.

Я реализовал пользовательский класс сериализатора

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.

1 Ответ

0 голосов
/ 06 декабря 2018

Вы должны сказать Джексону, что он должен использовать ваш сериализатор даже для нулевых значений.Это можно сделать с помощью @JsonSerializer также с параметром nullsUsing.

В вашем классе MyObject это будет выглядеть так:

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