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

时间:2019-05-28 16:05:47

标签: java json jackson

我无法使用杰克逊图书馆解组一个可以保存字符串值或另一个JSON对象的JSON密钥。

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

1)

"ProviderData": {
    "INVALID": "HEX",
    "#text": "Sample"
}

2)

"ProviderData": "1C"

有人可以对此问题进行验证并提出建议。

2 个答案:

答案 0 :(得分:0)

您可以反序列化为JsonNode,然后分别提取内容,或者反序列化为Object,然后使用instanceof来确定它是Map还是其他类型,或者使用custom deserializer将数据解压缩到可处理这两种情况的自定义对象中。

答案 1 :(得分:0)

您可以编写自定义反序列化器并处理这两种情况,也可以为ProviderData POJO类编写两个构造函数,并正确使用JsonCreatorJsonCreator批注。参见以下示例:

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构造函数映射,我们假定此值表示{{1} }键,例如invalid

另请参阅:

  1. Custom JSON Deserialization with Jackson
  2. sequentially deserialize using Jackson
  3. Deserialize strings and objects using jackson annotations in java