为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼啦一阵风 2022-12-21 15:08:48
我无法使用 Jackson 库解组可以保存字符串值或另一个 JSON 对象的 JSON 键。例如:- 以下是两个可能的值。1)"ProviderData": {    "INVALID": "HEX",    "#text": "Sample"}2)"ProviderData": "1C"有人可以验证并就此问题向我提出建议。
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

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


查看完整回答
反对 回复 2022-12-21
?
Helenr

TA贡献1780条经验 获得超4个赞

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



查看完整回答
反对 回复 2022-12-21
  • 2 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号