【问题标题】:Jackson deserialize string value that contains valid jsonJackson 反序列化包含有效 json 的字符串值
【发布时间】:2016-01-21 07:33:29
【问题描述】:

假设我有以下 JSON 数据:

{
    "header": "some value",
    "message": "{\"field1\": \"abc\", \"field2\": 123}"
}

是否可以调整 OuterClass 上的注解,使 message 字段被解析为 InnerClass 对象?

public class InnerClass {
    @JsonProperty("field1")
    public void setField1(String value) {/* do stuff */}

    @JsonProperty("field2")
    public void setField2(Integer value) {/* do stuff */}
}

public class OuterClass {
    @JsonProperty("message")
    public void setMessage(InnerClass obj) {/* do stuff */}  
}

理想情况下,我希望调用代码看起来像:

ObjectMapper mapper = new ObjectMapper();
OuterClass obj = mapper.readValue(jsonStr, OuterClass.class);

【问题讨论】:

  • 我猜是这样,Jackson 非常灵活。但是我没有我在这里工作过的代码,看看你是否能在我的这两个问题中找到任何有用的东西:firstsecond
  • 我会调查的。谢谢

标签: java json jackson


【解决方案1】:

构建您的外部类,使其具有表示嵌套 JSON 的其他类的属性,例如:

public class OuterClass {

    @JsonProperty("header")
    private String header; 

    @JsonProperty("message")
    private InnerClass message; 

    //getters & setters
}

【讨论】:

  • 我设法让这种方法发挥作用。但是,我必须创建一个接受这些值的构造函数。它不会使用默认构造函数,然后调用设置器。错误:Can not instantiate value of type [simple type, InnerClass] from JSON String; no single-String constructor/factory method (through reference chain: InnerClass)
【解决方案2】:

一旦我增加了一些复杂性,接受的答案就不起作用了。我一直收到错误:

Can not instantiate value of type [simple type, InnerClass] from JSON String; no single-String constructor/factory method (through reference chain: InnerClass)

我最终使用了以下方法

public class OuterClass {
    public InnerClass message;

    @JsonCreator
    public OuterClass (Map<String,Object> delegate) throws IOException {
        String json = (String)delegate.get("Message");
        ObjectMapper mapper = new ObjectMapper();
        this.message = mapper.readValue(json, InnerClass.class);
     }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2016-12-22
    相关资源
    最近更新 更多