2010-11-16 81 views
20

我有一个JSON对象,说:绑定JSON子对象的属性为Java对象领域杰克逊

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

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

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

如何我可以将的值从JSON设置为Foo Java对象中的bar字段?

我试过用@JsonProperty("foo.bar")注解该字段,但它不能像那样工作。

回答

43

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

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

有这个没有自动功能(据我所知),但是这是一个有点经常要求的功能;有这吉拉RFE:http://jira.codehaus.org/browse/JACKSON-132这听起来像你在找什么。

+0

是的,这是同样的问题,但我会用它来反序列化。如果我不想改变'Foo'对象的结构,我想我上面的解决方案是最好的。 – hleinone 2010-11-17 00:32:13

+0

是的,我认为是。 – StaxMan 2010-12-19 19:01:48

-16

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

+8

不是很有帮助。我不想创建无用的Java类,只是因为有人无法设计出像样的JSON API。 – hleinone 2012-11-13 07:26:32

+3

同意@hleinone。其中一个并不总是在控制API,并且不得不创建嵌套类/ maps/hacks/voodoo不是正确的解决方案。 – kontinuity 2012-12-12 10:51:51

-3

这里一个简单的例子,工程:

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

这与接受的答案没有什么不同。 – hleinone 2014-06-05 19:48:07

+1

为什么需要在你的答案中包含一串龙目东西?如果没有这些,实际上会有相同的结果。 – 2015-01-21 19:44:02