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

22

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

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

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

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

我该如何将JSON中foo.bar的值设置到Java对象Foobar字段中?

我尝试使用注释@JsonProperty("foo.bar")来标识这个字段,但是它并不起作用。

4个回答

45

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

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

2

是的,那就是同样的问题,不过我会用它来进行反序列化。如果我不想改变 Foo 对象的结构,我想上面的解决方案是我能得到的最好的方案了。 - hleinone

-4
这是一个简单的例子:
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");
    }
}

1
为什么需要在你的答案中包含一堆Lombok的东西?实际上,没有这些也会得到相同的结果。 - Simon Forsberg

-18

这就像把苹果绑在橙子上一样!另一个“流行语”可能是“阻抗不匹配”,或者在《星际迷航1》中说的“非时空序列!”将其绑定到匹配的对象上,然后在Java中对不同类型的对象进行新分配。


8
不是很有帮助。我不想因为有人设计不出一个好的JSON API而去创建无用的Java类。 - hleinone
3
同意 @hleinone 的观点。并不总是能够掌控 API,因此创建嵌套类/映射表/黑科技并不是正确的解决方案。 - Arif Amirani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接