【问题标题】:How to parse JSON element that can be either simple string or an object into Class Object如何将可以是简单字符串或对象的 JSON 元素解析为类对象
【发布时间】:2019-05-28 16:05:47
【问题描述】:

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

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

1)

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

2)

"ProviderData": "1C"

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

【问题讨论】:

  • 您是否有两个不同的 java 对象要映射,或者对象看起来如何?
  • 如果有String - 1C,是什么意思?是INVALID 还是#text 值?

标签: java json jackson


【解决方案1】:

您可以编写自定义反序列化器并处理这两种情况,或者为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 构造函数映射,我们假设此值表示来自 JSON Object 示例的 invalid 键。

另见:

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-12
    • 2017-01-26
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多