2016-03-21 13 views
0

私はその後、私は私のリストデシリアライザクラスのようにあるこのリストオブジェクトの代わりに単一のオブジェクトとしてリストを逆シリアル化する方法はありますか?

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

のようなYAMLファイルを持って、次のアドレスと、その後の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; 
    // .. 
} 

を持っています以下:

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; 
    // .. 
} 

あるI、そして、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

リストとしてシリアライズされた場合は、同じ方法でデシリアライズする必要があります。しかし、あなたはリストを持っていて、それを自分で繰り返すことができます。

関連する問題