将 JSON 子对象属性绑定到 Jackson 中的 Java 对象字段

Posted

技术标签:

【中文标题】将 JSON 子对象属性绑定到 Jackson 中的 Java 对象字段【英文标题】:Binding JSON child object property into Java object field in Jackson 【发布时间】:2011-05-11 03:09:17 【问题描述】:

我有一个 JSON 对象,比如说:


  "foo": 
    "bar": 1
  ,
  "baz": 2

我想将它绑定到一个 Java 对象中,例如:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Foo 
  private int bar;
  @JsonProperty("baz")
  private int baz;

如何将 foo.bar 的值从 JSON 设置为 Foo Java 对象中的 bar 字段?

我尝试使用 @JsonProperty("foo.bar") 注释该字段,但它不起作用。

【问题讨论】:

【参考方案1】:

这里有一个简单的例子:

JSON:

["function":"name":"Function 1",
 "function":"name":"Function 2"]

Java:

import java.util.Map;

import javax.xml.bind.annotation.XmlRootElement;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
@Getter
@Setter
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class Function 
    @JsonProperty("name")
    private String name;

    @JsonProperty("function")
    public void setFunction(Map<String, Object> function) 
      name = (String) function.get("name");
    

【讨论】:

为什么需要在你的答案中包含一堆龙目岛的东西?如果没有这些,它实际上会产生相同的结果。【参考方案2】:

这就像将苹果绑定到橙子上!另一个“吸引人的短语”是“阻抗不匹配”,或者在《星际迷航 1》中,“非 Sequetor!”将它绑定一个 MATCHED 对象,然后在 Java 中对不同类型的对象进行新的赋值。

【讨论】:

不是很有帮助。我不想仅仅因为有人无法设计出像样的 JSON API 而创建无用的 Java 类。 同意@hleinone。一个人并不总是能够控制 API,并且必须创建嵌套类/地图/hacks/voodoo 不是正确的解决方案。【参考方案3】:

这没有自动化功能(据我所知),但这是一个经常被要求的功能;有这个 Jira RFE:http://jira.codehaus.org/browse/JACKSON-132,这听起来像是您正在寻找的东西。

【讨论】:

是的,这是同一个问题,虽然我会用它来反序列化。如果我不想更改 Foo 对象的结构,我想我上面的解决方案是我能得到的最好的解决方案。【参考方案4】:

这并不完美,但这是我能想到的最优雅的方式。

@JsonProperty("foo")
public void setFoo(Map<String, Object> foo) 
  bar = (Integer) foo.get("bar");

【讨论】:

以上是关于将 JSON 子对象属性绑定到 Jackson 中的 Java 对象字段的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jackson 将 JSON 键值数组动态映射到子对象?

在 Spring MVC 中,无法使用 Jackson @JsonFormat 将输入绑定到日期字段

返回JSON到前台的对象属性设置

使用 Jackson 处理未知的 JSON 属性

Jackson 不会将新的 JSON 对象附加到现有的 Json 文件中

Jackson工具使用