将 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 将输入绑定到日期字段