如何将可以是简单字符串或对象的 JSON 元素解析为类对象

我无法使用 Jackson 库解组可以保存字符串值或另一个 JSON 对象的 JSON 键。


例如:- 以下是两个可能的值。


1)


"ProviderData": {

    "INVALID": "HEX",

    "#text": "Sample"

}

2)


"ProviderData": "1C"

有人可以验证并就此问题向我提出建议。


呼啦一阵风
浏览 120回答 2
2回答

慕婉清6462132

您可以编写自定义反序列化器并处理这两种情况,或者为ProviderData POJO类编写两个构造函数并正确使用JsonCreator和JsonCreator注释。请参阅以下示例:import com.fasterxml.jackson.annotation.JsonCreator;import com.fasterxml.jackson.annotation.JsonProperty;import com.fasterxml.jackson.databind.ObjectMapper;import java.io.File;public class JsonApp {    public static void main(String[] args) throws Exception {        File jsonFile = new File("./resource/test.json").getAbsoluteFile();        ObjectMapper mapper = new ObjectMapper();        System.out.println(mapper.readValue(jsonFile, Response.class));    }}class Response {    @JsonProperty("ProviderData")    private ProviderData data;    // getters, setters, toString}class ProviderData {    private static final String INVALID_NAME = "INVALID";    private static final String TEXT_NAME = "#text";    @JsonProperty(INVALID_NAME)    private final String invalid;    @JsonProperty(TEXT_NAME)    private final String text;    @JsonCreator(mode = JsonCreator.Mode.DELEGATING)    public ProviderData(String invalid) {        this(invalid, null);    }    @JsonCreator    public ProviderData(@JsonProperty(INVALID_NAME) String invalid, @JsonProperty(TEXT_NAME) String text) {        this.invalid = invalid;        this.text = text;    }    // getters, toString}对于这个JSON有效载荷:{  "ProviderData": {    "INVALID": "HEX",    "#text": "Sample"  }}以上示例打印:Response{data=ProviderData{invalid='HEX', text='Sample'}}对于String原始JSON有效载荷:{  "ProviderData": "1C"}以上示例打印:Response{data=ProviderData{invalid='1C', text='null'}}如您所见,使用构造函数JSON Object正确映射,使用2-arg构造函数String映射原语1-arg,我们假设此值表示示例中的invalid键JSON Object。

Helenr

您可以反序列化为JsonNode然后单独提取内容,或者反序列化为 anObject并用于instanceof确定它是Map一种类型还是另一种类型,或者使用自定义反序列化程序将数据解压缩到处理这两种情况的自定义对象中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python