2016-03-21 3 views
0

Ich habe die folgende Adresse und Address KlassenWie man eine Liste als einzelne Objekte deserialisiert anstatt eines Listenobjektes?

public class Address { 
    private String street; 
    private String city; 
    private String state; 
    // ... 
} 


public class AddressList { 
    private List<Address> addresses; 
    // ... 
} 

und dann eine Klasse Person

public class Person { 
    private String name; 
    @JsonDeserialize(contentUsing = ListDeserializer.class) 
    private Map<String, AddressList> addresses; 
    // .. 
} 

Dann habe ich die YAML-Datei wie diese als

--- 
name: 'abc' 
addresses: 
    offices: 
    - street: 123 main st 
     city: san francisco 
     state: ca 
    - street: 234 post st 
     city: san francisco 
     state: ca 

Meine Liste Deserializer-Klasse folgt:

public class ListDeserializer extends JsonDeserializer<AddressList> { 


@Override 
public AddressList deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { 
    return jsonParser.readValueAs(new TypeReference<Map<String, List<Address>>>() { 
    }); 
} 
Code

} meine Analyse ist wie folgt:

ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory()); 
return objectMapper.readValue(inputYamlFile, Person.class); 

wenn ich die Liste der Adressen lesen: er druckt als

{offices=null} 

Kann jemand bei der Lösung dabei helfen?

Antwort

0

Ich habe einen Weg gefunden, dieses Problem zu lösen, indem ich die Karte für die Deserialisierung von Adressen mit dem Konverter benutze.

Die Modifikationen ich gemacht sind

public class Person { 
    private String name; 
    @JsonDeserialize(converter = AddressListConverter.class) 
    private Map<String, AddressList> addresses; 
    // .. 
} 

ich dann eine neue Konverter-Klasse für die Address schrieb.

public class AddressListConverter implements Converter<Map<String, List<LinkedHashMap>>, Map<String, AddressList>> { 
@Override 
    public Map<String, AddressList> convert(Map<String, List<LinkedHashMap>> stringListMap) { 
     Map<String, AddressList> addressListMap = new HashMap<>(); 
     ObjectMapper mapper = new ObjectMapper(); 
     for (Map.Entry<String, List<LinkedHashMap>> entry : stringListMap.entrySet()) { 
     AddressList addressList = new AddressList(); 
     for(LinkedHashMap map: entry.getValue()) { 
      Address address = mapper.convert(map, Address.class); 
      addressList.getAddresses().add(address); 
     } 
      addressListMap.put(entry.getKey(), addressList); 
     } 
    return addressListMap; 
    } 

    @Override 
    public JavaType getInputType(TypeFactory typeFactory) { 
    return typeFactory.constructMapType(Map.class, String.class, List.class); 
    } 

    @Override 
    public JavaType getOutputType(TypeFactory typeFactory) { 
     return typeFactory.constructMapType(Map.class, String.class, AddressList.class); 
    } 
} 

Dies sollte den Trick

tun
0

Wenn es als Liste serialisiert wurde, müssen Sie es auf die gleiche Weise deserialisieren. Aber du hast dann die Liste und kannst sie selbst durchlaufen.