java - 如何将简单字符串或对象的 JSON 元素解析为类对象

标签 java json jackson

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

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

1)

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

2)

"ProviderData": "1C"

有人可以验证一下这个问题并给我建议吗?

最佳答案

您可以编写自定义反序列化器并处理这两种情况,或者为 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'}}

如您所见,使用 2-arg 构造函数正确映射 JSON 对象,使用 1-arg 构造函数映射 String 原语,我们假设该值表示 JSON 对象 示例中的 无效 键。

另请参阅:

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

关于java - 如何将简单字符串或对象的 JSON 元素解析为类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56346210/

相关文章:

php - PHP 中的 JSON – 嵌套数组

java - CXF 使用 JSON 调用 REST 服务

java - Java 读取流式 Json 的标准方法

java - 未能将 VALUE_STRING 解码为 base64

java - Java 模糊测试库

java - 格式化日历事件的日期时间对象,从谷歌日历API检索

android - 文本未在 Baseadapter 中设置

java - 如何使用 Jackson ObjectMapper 检测尾随垃圾

java - 如何使用java客户端并发发布MQTT消息?

java - 为什么我的 simpleDateFormat 搞砸了星期几?