当前位置: 首页 > 知识库问答 >
问题:

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

戚俊健
2023-03-14

我无法使用Jackson Library解组一个JSON密钥,该密钥既可以保存字符串值,也可以保存另一个JSON对象。

下面是两个可能的值。

1)

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

2)

"ProviderData": "1C"

有人能核实一下,并就这个问题向我提出建议吗。

共有2个答案

许自强
2023-03-14

您可以反序列化到JsonNode,然后分别提取内容,或者反序列化到对象,并使用实例确定它是映射还是其他类型,或者使用自定义反序列化程序将数据解压到处理这两种情况的自定义对象中。

楚瑞
2023-03-14

您可以编写自定义反序列化程序并处理这两种情况,或者为ProviderDataPOJO类编写两个构造函数,并正确使用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
}

对于这个JSONpayload:

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

上面的示例打印:

Response{data=ProviderData{invalid='HEX', text='Sample'}}

对于StringprimitiveJSONpayload:

{
  "ProviderData": "1C"
}

上面的示例打印:

Response{data=ProviderData{invalid='1C', text='null'}}

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

另见:

  1. 使用Jackson自定义JSON反序列化。
  2. 使用Jackson顺序反序列化。
  3. 在java中使用jackson注释对字符串和对象进行反序列化。
 类似资料:
  • 我想解析一些JSON,但一个键要么是字符串,要么是对象。 这是我当前的结构:https://github.com/PhillippOhlandt/pmtoapib/blob/master/CollectionItemRequest.go#L10 在这里,“Url”属性不仅可以是字符串,还可以是对象。 我开始为它创建一个自己的结构,覆盖对象案例。 但是这样字符串版本就不行了。有没有一种方法既能处理这

  • 问题内容: 我有一个.NET中的SOAP Web服务返回的JSON字符串。如下: 现在,我想将此字符串解析为JSON对象。我也看了这个,他们已经用这行代码: 所以我可以通过用我的字符串名称替换“ json”来做到这一点。还需要引用除NewtonSoft.dll以外的任何其他dll吗? 顺便说一句,这是完整的网络服务代码 问题答案: 用 您需要System.Web.Extensions dll并导入

  • 问题内容: 我目前正在尝试将收到的JSON对象转换为具有相同属性的TypeScript类,但无法使其正常工作。我究竟做错了什么? 员工阶层 员工字符串 我的尝试 链接到打字稿游乐场 问题答案: 编译器允许您将返回的对象强制转换为类的原因是因为typescript基于结构子类型。 您实际上并没有的实例,而是拥有一个具有相同属性的对象(如在控制台中看到的)。 一个简单的例子: (操场上的代码) 没有错

  • 问题内容: 我想将以下JSON字符串转换为Java对象: 我的目标是轻松访问它,例如: 我听说过Jackson,但是由于涉及“ mymusic”列表,我不知道如何使用它来适应我拥有的json字符串,因为它不仅仅是键值对。如果杰克逊不是最好的选择,我该如何用杰克逊完成? 问题答案: 为此,无需与GSON一起使用;杰克逊可以做普通的地图/列表: 或更方便的JSON树: 顺便说一句,没有理由为什么您不能

  • 问题内容: 尝试使用gson将以下json字符串解析为java对象 我有我的java类 转换后,我得到的提示对象为空。 有人可以纠正我吗 问题答案: 试试这个JSON: 使用此Java类: 奇迹般有效 输出:

  • 问题内容: 我有以下json 问题在于,价值价值也是 要么 并将其存储在这些 我相信我通过这样做解决了不是数组而是单个对象的问题 现在,当整个事情以字符串形式返回时,我仍然处于困境.... 问题答案: 我们的想法是试图让(从外地 )为第一,如果抛出异常,这将意味着,没有 进入 ,这将意味着是。用同样的方法,我们可以计算出状况时场。 在我的示例代码中,其他操作也可能引发jsonExceptions,