在一个JSON Object
中,值是双倍的,有时是作为对象而来的,它是受配置驱动的API
,我正在使用该值,但是在POJO
中有任何方法识别要管理的相同密钥名称和不同数据类型的数据类型。
是否可以在POJO
级进行处理。
{
"total": 56278160
}
或:
{
"total": {
"val1": 92444080,
"val2": 107372544,
"val3": 113946624
}
}
答案 0 :(得分:0)
有时一个字段可以存储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
。