2016-03-21 50 views
0

我有以下地址和AddressList中類如何將列表反序列化爲單個對象而不是列表對象?

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


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

,然後一個Person類

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

然後我有YAML文件中像這樣

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

我的列表解串器類是作爲如下:

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

} 我解析代碼如下:

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

,當我讀到地址列表:它打印爲

{offices=null} 

任何人都可以解決這方面的幫助?

回答

0

我找到了一種方法來解決這個問題,使用反序列化地址映射使用轉換器。

我所做的修改是

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

我的話,寫了一個新的轉換器類爲AddressList中。

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

這應該做的伎倆

0

如果它被序列化爲一個列表,你必須以同樣的方式對它進行反序列化。但是你有清單,並且可以自己迭代它。