Java Jackson - Как сериализовать Double NaN без кавычек?

Мне нужно сериализовать поле Double, содержащее NaN число, но Джексон всегда пытается записать его как String, например. "value": "Nan". Как я могу изменить его на "value": Nan вместо этого?

Ниже приведен код для воспроизведения:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.json.JsonReadFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {
    public String name;
    public int age;
    private int favoriteNumber;
    private Double value = Double.NaN;

    public Test(String name, int age, int favoriteNumber) {
        this.name = name;
        this.age = age;
        this.favoriteNumber = favoriteNumber;
    }

    @JsonProperty
    public String getFavoriteNumber() {
        return String.valueOf(favoriteNumber);
    }

    @JsonProperty
    public Double getValue() {
        return this.value;
    }

    public static void main(String... args) throws Exception {
        Test p = new Test("Joe", 25, 123);
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(JsonReadFeature.ALLOW_NON_NUMERIC_NUMBERS.mappedFeature());
        mapper.configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true);
        System.out.println(mapper.writeValueAsString(p));
        // {"name":"Joe","age":25,"favoriteNumber":"123","value":"NaN"}
    }
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это невозможно, потому что NaN не является допустимым значением JSON. Вы можете попробовать преобразовать его в null в своем методе получения.

Ответ принят как подходящий

Добавьте аннотацию @JsonRawValue, вот так

@JsonProperty
@JsonRawValue
public Double getValue() {
    return this.value;
}

Это даст вам этот результат {"name":"Joe","age":25,"favoriteNumber":"123","value":NaN}

Другие вопросы по теме