2013-07-16 25 views
15

ho una stringa JSON come:Jackson deserializzazione con sconosciuti proprietà dinamiche

"shipping_profiles": { 
    "563": { 
    "name": "name", 
    "value": "value"    
    }, 
    "564": { 
    "name": "name", 
    "value": "value"    
    }, 
    "565": { 
    "name": "name", 
    "value": "value"    
    }, 
    "566": { 
    "name": "name", 
    "value": "value"    
    } 
} 

Ora sono parsing con Jackson 2.0. Sto cercando di ottenere uno List<shipping_profiles> dalla stringa JSON.

È possibile?

+0

Puoi mostrarci come si presenta la tua classe POJO? –

+0

Sei sicuro di non volere che shipping_profiles sia un array? Per esempio. "shipping_profiles": ["563": {...}, ...]. –

+0

@ Michał Ziober: fino ad ora non ho progettato il POJO. In attesa di aiuto da parte tua per progettare il POJO –

risposta

20

La proprietà shipping_profiles non sembra una matrice. Rappresenta l'oggetto con proprietà dinamiche, quindi dovremmo trattarlo come un oggetto. Se non sappiamo nulla delle proprietà, possiamo usare l'annotazione @JsonAnySetter. Di seguito è riportato l'algoritmo Algoritmo:

  1. Deserializzare JSON in classi modello JSON.
  2. Converti oggetti dinamici (mappe) in classi POJO dell'app utilizzando ObjectMapper
  3. Utilizza POJO dell'app ogni volta che lo desideri.

Si prega di vedere il mio esempio di implementazione. Spero, ti aiuti a risolvere il tuo problema. JSON ingresso: programma

{ 
    "shipping_profiles":{ 
     "563":{ 
     "name":"name563", 
     "value":"value563" 
     }, 
     "564":{ 
     "name":"name564", 
     "value":"value564" 
     }, 
     "565":{ 
     "name":"name565", 
     "value":"value565" 
     }, 
     "566":{ 
     "name":"name566", 
     "value":"value566" 
     } 
    } 
} 

Esempio:

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class JacksonProgram { 

    public static void main(String[] args) throws IOException { 
     ObjectMapper mapper = new ObjectMapper(); 

     File source = new File("X:/test.json"); 
     Entity entity = mapper.readValue(source, Entity.class); 
     ShippingProfiles shippingProfiles = entity.getShippingProfiles(); 
     List<Map<String, String>> profileMaps = shippingProfiles.getProfiles(); 

     List<Profile> profiles = new ArrayList<Profile>(profileMaps.size()); 
     for (Map<String, String> item : profileMaps) { 
      profiles.add(mapper.convertValue(item, Profile.class)); 
     } 
     System.out.println(profiles); 
    } 
} 

class Entity { 

    @JsonProperty("shipping_profiles") 
    private ShippingProfiles shippingProfiles; 

    public ShippingProfiles getShippingProfiles() { 
     return shippingProfiles; 
    } 

    public void setShippingProfiles(ShippingProfiles shippingProfiles) { 
     this.shippingProfiles = shippingProfiles; 
    } 
} 

class ShippingProfiles { 

    private List<Map<String, String>> profiles = new ArrayList<Map<String, String>>(); 

    @JsonAnySetter 
    public void setDynamicProperty(String name, Map<String, String> map) { 
     profiles.add(map); 
    } 

    public List<Map<String, String>> getProfiles() { 
     return profiles; 
    } 

    public void setProfiles(List<Map<String, String>> profiles) { 
     this.profiles = profiles; 
    } 
} 

class Profile { 

    private String name; 
    private String value; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getValue() { 
     return value; 
    } 

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

    @Override 
    public String toString() { 
     return "Profile [name=" + name + ", value=" + value + "]"; 
    } 
} 

Sopra stampe app:

[Profile [name=name563, value=value563], Profile [name=name564, value=value564], Profile [name=name565, value=value565], Profile [name=name566, value=value566]] 
0

ho ottenuto il mio JSON con proprietà dinamica analizzato con il modo in cui @michalziober fornire.

"commandClasses": { 
     "32": { 
      "name": "Basic", 
      "data": { 
      "name": "devices.1.instances.1.commandClasses.32.data", 
      "value": null, 
      "type": "NoneType" 
     }, 
     "38": { 
      "name": "SwitchMultilevel", 
      "data": { 
      "name": "devices.1.instances.1.commandClasses.38.data", 
      "value": null, 
      "type": "NoneType" 
     }, 
     "43": { 
      "name": "SceneActivation", 
      "data": { 
      "name": "devices.1.instances.1.commandClasses.43.data", 
      "value": null, 
      "type": "NoneType" 
     } 

Con questo JSON Ho anche bisogno di salvare la proprietà dinamica, così ho aggiungere un altro elenco per riporlo.

public class CommandClasses { 

    private List<String> nameList = new ArrayList<String>(); 
    private List<CommandClass> commmandClasses = new ArrayList<CommandClass>(); 
    private Logger logger = Logger.getInstance(CommandClasses.class); 

    @JsonAnySetter 
    public void setDynamicCommandClass(String name, CommandClass cc) { 
     logger.d("@ adding new CC : " + name); 
     nameList.add(name); 
     commmandClasses.add(cc); 
    } 

    public List<CommandClass> getCommmandClasses() { 
     return commmandClasses; 
    } 

    public void setCommmandClasses(List<CommandClass> commmandClasses) { 
     this.commmandClasses = commmandClasses; 
    } 
} 

Ora posso anche accedere al campo come ID per inviare richiesta in un secondo momento.

Problemi correlati