Иногда, когда одно поле может хранить 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
.