2015-05-07 6 views
5

Ich versuche, eine JSON-Datei auf eine Weise zu entpacken, so dass nur wenige Eigenschaften von Json in einer HashMap zugeordnet sind, die in meiner Modellklasse vorhanden ist.Rest der Eigenschaften zugeordnet sind die entsprechenden Felder der class.Please die Json unten finden:Konvertieren Sie einen Teil von Json zu HashMap mit Jackson ObjectMapper

{ 
     "_id":2, 
     "Name":"xyz", 
     "Age":20, 
     "MEMO_TEXT":"yyy", 
     "MEMO_LINK":"zzz", 
     "MEMO_DOB":"", 
     "MEMO_USERNAME":"linie orange", 
     "MEMO_CATEGORY":2, 
     "MEMO_UID":"B82071415B07495F9DD02C152E4805EC" 
     } 

Und hier ist das Modell Klasse, zu der ich diese Json abbilden wollen:

public class Model{ 

    private int        _id; 
    private String       name; 
    private int        age 
    private HashMap<String, String> columns; 

    //Getters and Setter methods 
} 

Also hier, was ich will, ist zu Holen Sie sich eine Karte columns, die Schlüssel enthält "MEMO_TEXT","MEMO_LINK","MEMO_DOB","MEMO_USERNAME","MEMO_CATEGORY","MEMO_UID"

und der Rest der Eigenschaften in Json sind ihren jeweiligen Feldern zugeordnet.

Ist es möglich, dies mit ObjectMapper von Jackson Library zu tun?

+0

Sie könnten Ihren eigenen Deserializer schreiben – assylias

Antwort

9

Sie können @JsonAnySetter verwenden, um ein Verfahren mit Anmerkungen versehen, um für „andere“ Eigenschaften genannt werden:

@Test 
public void partial_binding() throws Exception { 
    Model model = mapper.readValue(Resources.getResource("partial_binding.json"), Model.class); 
    assertThat(model.name, equalTo("xyz")); 
    assertThat(model.columns, hasEntry("MEMO_TEXT", "yyy")); 
    assertThat(
      mapper.writeValueAsString(model), 
      json(jsonObject() 
       .withProperty("Name", "xyz") 
       .withProperty("MEMO_TEXT", "yyy") 
       .withAnyOtherProperties())); 
} 

public static class Model { 
    @JsonProperty 
    private int _id; 
    @JsonProperty("Name") 
    private String name; 
    @JsonProperty("Age") 
    private int age; 
    private HashMap<String, String> columns; 

    @JsonAnyGetter 
    public HashMap<String, String> getColumns() { 
     return columns; 
    } 

    public void setColumns(HashMap<String, String> columns) { 
     this.columns = columns; 
    } 

    @JsonAnySetter 
    public void putColumn(String key, String value) { 
     if (columns == null) columns = new HashMap<>(); 
     columns.put(key, value); 
    } 
} 

Auch @JsonAnyGetter bedeutet „Art des Reverse“, so sollte dies auf die gleiche Weise serialisiert und deserialisiert .

+0

Danke @araqnid. das funktioniert gut. – Puneetr90

+0

@ Puneetr90 froh zu helfen. Wenn Sie der Meinung sind, dass Ihre Frage beantwortet wurde, klicken Sie auf das Häkchen neben der Antwort, um sie als "akzeptiert" zu markieren. – araqnid

0

Verwenden Sie einen SerializerProvider. Ein SerializerProvider kann die Deserialisierung ändern und die benutzerdefinierte Deserialisierung aktivieren.

1

Eine von mehreren Möglichkeiten, um zu erreichen, was Sie wollen, ist ein Konstruktor hinzuzufügen:

@JsonCreator 
public Model(Map<String, Object> fields) { 
    this._id = (int) fields.remove("_id"); 
    this.name = (String) fields.remove("Name"); 
    this.age = (int) fields.remove("Age"); 
    this.columns = new HashMap<String, String>(); 
    for (Entry<String, Object> column : fields.entrySet()) { 
     columns.put(column.getKey(), column.getValue().toString()); 
    } 
} 

Beachten Sie, dass, wenn Sie es zu JSON serialisiert zurück die Struktur diffrent sein wird als die ersten.