2017-10-05 11 views
3

ジャックソンを使用すると、json構造と似ていないネストされたオブジェクトを持つJavaにデュマップjsonが可能かどうか疑問に思う。ジャクソン:ネストされたオブジェクトをマップ

ここでは、私がしたいことの例を示します。

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

アノテーションを使用することはできませんが、独自のデシリアライザを作成して、Jsonをマップのように管理し、自分でpojoにフィールドを設定することができます。 https://fasterxml.github.io/jackson-databind/javadoc/2.3.0/com/fasterxml/jackson/databind/JsonDeserializer.html –

+0

@DmytroDovzhenko実際にそれが可能であることを知らせるためにPingingして、私の答えを参照してください – Felk

答えて

4
@JsonUnwrapped 
private final SomeObject someObject; 

シリアライズするときは、次の結果として、親にSomeObjectのフィールドのすべてをunwrappes:

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

私はそれがSerializateのためだけに働くと思う、私はDeserializeをしたい... しかし、私はそれを試してみる –

+0

それはまた、逆シリアル化のために動作します。私はあなたにそれを動作させるのに問題がある場合、あなたに実用的な例を与えることができます – Felk

+0

文書にはシリアル化だけが言及されていても効果的な作業です。 ありがとう! –

0

まず、これはJSONオブジェクトです。

これはobject literalです。

第2に、これは有効な書式付きオブジェクトリテラルではありません。 正しいものはこれです:コメントでsaydよう

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

次に、あなたがあなた自身のデシリアライザを定義する必要があります。

メイン:

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

をオブジェクトにJSON文字列に変換することができますObjectMapper使用JsonUnwrapped注釈を使用してください。 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(); 
} 
関連する問題