2010-11-16 78 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