JSON с тем же именем, что и ключ с другим типом данных - PullRequest
1 голос
/ 02 ноября 2019

В одном JSON Object значение приходит как удвоенное, а иногда приходит как объект, где оно API управляется с конфигурацией, и я использую значение, но есть ли в POJO способ идентифицировать тип данных для управлениядля одного и того же имени ключа с другим типом данных.

Можно ли обрабатывать на уровне POJO.

 {
  "total": 56278160
 }

или:

 {
     "total": {
          "val1": 92444080,
          "val2": 107372544,
          "val3": 113946624
     }
 }

1 Ответ

0 голосов
/ 02 ноября 2019

Иногда, когда одно поле может хранить JSON Object и primitive, этот примитив является просто «коротким» представлением JSON Object. Например, установлено только одно поле - val1, и службы возвращают только его без переноса в JSON Object. В этом случае вы можете создать POJO с двумя конструкторами: один для одного Number и один для всех обязательных полей.

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class JsonPathApp {

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);

        Root rootWithNumber = mapper.readValue("{\"total\": 56278160}", Root.class);
        System.out.println(rootWithNumber);
        Root rootWithObject = mapper.readValue("{\"total\": {\"val1\": 92444080, \"val2\": 107372544, \"val3\": 113946624}}", Root.class);
        System.out.println(rootWithObject);
    }
}

class Total {
    private final long val1;
    private final long val2;
    private final long val3;

    @JsonCreator
    public Total(long value) {
        this(value, 0, 0);
    }

    @JsonCreator
    public Total(@JsonProperty("val1") long val1,
                 @JsonProperty("val2") long val2,
                 @JsonProperty("val3") long val3) {
        this.val1 = val1;
        this.val2 = val2;
        this.val3 = val3;
    }

    // getters, toString
}

class Root {
    private Total total;

    // getters, setters, toString
}

Выше кода печатается:

Root{total=Total{val1=56278160, val2=0, val3=0}}
Root{total=Total{val1=92444080, val2=107372544, val3=113946624}}

Если эти представления не связаны, вы можете использовать тип JsonNode.

class Root {
    private JsonNode total;
}

, а затем использовать методы isNumber и isObject, чтобы определить, представляет ли оно primitive или JSON Object.

...