【问题标题】:How to deserialize a list as a single objects instead of a list object?如何将列表反序列化为单个对象而不是列表对象?
【发布时间】:2016-03-21 23:36:24
【问题描述】:

我有以下 Address 和 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

我的List反序列化类如下:

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}

谁能帮忙解决这个问题?

【问题讨论】:

    标签: java jackson deserialization yaml


    【解决方案1】:

    如果它被序列化为一个列表,你必须以同样的方式反序列化它。但是你有了这个列表,并且可以自己迭代它。

    【讨论】:

      【解决方案2】:

      我找到了一种解决此问题的方法,即使用 Converter 反序列化地址映射。

      我所做的修改是

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

      这应该可以解决问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-20
        • 2022-01-19
        • 1970-01-01
        • 2013-12-16
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        相关资源
        最近更新 更多