2017-10-05 593 views
3

使用jackson,我想知道是否有可能將json映射到Java,嵌套對象不像json結構。Jackson:映射嵌套對象

這裏是我想要做的例子。

JSON:

{ 
    a = "someValue", 
    b = "someValue", 
    c = "someValue" 
} 

的Java:

public class AnObject { 
    @JsonProperty("a") 
    private String value; 

    //Nested object 
    private SomeObject; 
} 

public class SomeObject { 
    @JsonProperty("b") 
    private String value1; 

    @JsonProperry("c") 
    private String value2; 
} 

這可能嗎?

+0

使用註釋是不可能的,但是你可以編寫你自己的反序列化器,在那裏你可以像管理Map一樣管理Json並自己填充pojo字段。 https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind/JsonDeserializer.html –

+0

@DmytroDovzhenko Pinging你讓你知道這確實是可能的,看到我的回答 – Felk

回答

4

使用JsonUnwrapped註釋:

@JsonUnwrapped 
private final SomeObject someObject; 

這unwrappes所有SomeObject的場爲父母,導致下面的序列化時:

{"a":"foo","b":"bar","c":"baz"} 
+0

我認爲它只適用於Serializate,我想要反序列化... 但我會試一試 –

+0

它也適用於反序列化。我可以給你一個工作的例子,如果你無法使其工作 – Felk

+0

有效地工作,即使文檔只提到序列化。 謝謝! –

0

首先,這是一個JSON對象。

這是一個object literal

其次,這不是一個有效的格式化對象文字。 正確的一個是這樣的:

{ "a" : "someValue", "b": "someValue", "c": "someValue"} 

接下來,評論sayd,你必須定義自己的解串器。

主營:

public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 

    String json = "{\"a\" : \"someValue\",\"b\" : \"someValue\",\"c\" : \"someValue\"}"; 

    final ObjectMapper om = 
     new ObjectMapper();// 
    om.registerSubtypes(AnObject.class); 
    SimpleModule module = new SimpleModule(); 
    module.addDeserializer(AnObject.class, new CustomDeserializer2()); 
    om.registerModule(module); 

    AnObject ob = om.readValue(json, AnObject.class); 
    System.out.println(ob.getValue()); 
    System.out.println(ob.getObject().getValue1()); 
    System.out.println(ob.getObject().getValue2()); 
} 

解串器:

public class CustomDeserializer2 extends StdDeserializer<AnObject> { 

private static final long serialVersionUID = -3483096770025118080L; 

public CustomDeserializer2() { 
    this(null); 
} 

public CustomDeserializer2(Class<?> vc) { 
    super(vc); 
} 

@Override 
public AnObject deserialize(JsonParser jp, DeserializationContext ctxt) 
     throws IOException, JsonProcessingException { 
    JsonNode interNode = jp.getCodec().readTree(jp); 

    AnObject ob = new AnObject(); 

    if (interNode.get("a") != null) { 
     ob.setValue(interNode.get("a").toString()); 
    } 

    SomeObject obj = new SomeObject(); 

    if (interNode.get("b") != null) { 
     obj.setValue1(interNode.get("b").toString()); 
    } 
    if (interNode.get("c") != null) { 
     obj.setValue2(interNode.get("c").toString()); 
    } 

    ob.setObject(obj); 
    return ob; 
} 

型號:注重@JsonProperty某個字段

public class AnObject { 

@JsonProperty("a") 
private String value; 

private SomeObject object; 

public String getValue() { 
    return value; 
} 

public void setValue(String value) { 
    this.value = value; 
} 

public SomeObject getObject() { 
    return object; 
} 

public void setObject(SomeObject arg) { 
    object = arg; 
} 



public class SomeObject { 

private String value1; 
private String value2; 
public String getValue1() { 
    return value1; 
} 
public void setValue1(String value1) { 
    this.value1 = value1; 
} 
public String getValue2() { 
    return value2; 
} 
public void setValue2(String value2) { 
    this.value2 = value2; 
} 

再見

1

使用ObjectMapper可以轉換成JSON字符串對象。 通過someObject字段在您的AnObject類中使用JsonUnwrapped

@JsonUnwrapped 
private SomeObject someObject; 

然後讀取JSON字符串並將其轉換爲AnObject。

ObjectMapper mapper = new ObjectMapper(); 
try { 
    AnObject anObject1 = mapper.readValue(jsonString, AnObject.class); 
} catch (IOException e) { 
    e.printStackTrace(); 
}