2015-05-07 19 views
5

Sto provando a decomprimere un file json in modo tale che poche proprietà di Json siano mappate in una HashMap presente nella mia classe modello. Il resto delle proprietà è mappato a i rispettivi campi della class.Please trovare la JSON qui sotto:Convertire una parte di JSON in HashMap usando 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" 
     } 

Ed ecco la classe del modello per cui voglio mappare questo JSON:

public class Model{ 

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

    //Getters and Setter methods 
} 

Quindi, ecco, quello che voglio è quello di ottieni una mappa columns che contiene le chiavi "MEMO_TEXT","MEMO_LINK","MEMO_DOB","MEMO_USERNAME","MEMO_CATEGORY","MEMO_UID"

e il resto delle proprietà in Json sono mappati ai rispettivi campi.

È possibile farlo utilizzando ObjectMapper di Jackson Library?

+0

È possibile scrivere il proprio deserializzatore – assylias

risposta

9

È possibile utilizzare @JsonAnySetter per annotare un metodo da chiamare per "altre" proprietà:

@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); 
    } 
} 

Inoltre, @JsonAnyGetter fa "tipo del rovescio", quindi questo dovrebbe serializzare e deserializzare allo stesso modo .

+0

Grazie a @araqnid. questo funziona bene. – Puneetr90

+0

@ Puneetr90 felice di essere di aiuto. se ritieni che la tua domanda abbia avuto risposta, fai clic sul segno di spunta accanto alla risposta per contrassegnarla come "accettata". – araqnid

0

Provare a utilizzare SerializerProvider. Un SerializerProvider può modificare la deserializzazione, abilitando la deserializzazione personalizzata.

1

Uno dei diversi modi per raggiungere ciò che si vuole è quello di aggiungere un costruttore:

@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()); 
    } 
} 

essere consapevoli che se si serializzare di nuovo al JSON la struttura sarà differente rispetto a quella iniziale.

Problemi correlati