背景:
项目中使用jackson反序列化工作时出现了Can not deserialize instance of相关的异常,现在针对出现的几种情况做一个小小的总结。
(1)Cannot deserialize instance of `com.ysl.test.bo.Street` out of START_ARRAY token
public class AddressList {
private List<Street> streetLine;
private String city;
private String state;
private String postalCode;
private String county;
private String countryCode;
}
@Data
public class AddressObject {
private Street streetLine;
private String city;
private String state;
private String postalCode;
private String county;
private String countryCode;
}
测试方法:
@Test
public void test1()throws Exception{
ObjectMapper objectMapper = new ObjectMapper();
AddressList addressList = new AddressList();
List<Street> streetList = new ArrayList<Street>();
Street street = new Street();
street.setAddressLine1("street1");
street.setAddressLine2("street2");
streetList.add(street);
addressList.setStreetLine(streetList);
addressList.setCity("china");
String addressStr = objectMapper.writeValueAsString(addressList);
AddressObject addressObject = objectMapper.readValue(addressStr, AddressObject.class);
}
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `com.ysl.test.bo.Street` out of START_ARRAY token
at [Source: (String)"{"streetLine":[{"addressLine1":"street1","addressLine2":"street2"}],"city":"china","state":null,"postalCode":null,"county":null,"countryCode":null}"; line: 1, column: 15] (through reference chain: com.ysl.test.bo.AddressObject["streetLine"])
错误原因: 待转换的json字符串里面(如AddressList里面的streetLine属性)为List类型的时候,而反序列化中提供的class文件 对应的字段为Object属性
@Test
public void test2()throws Exception{
ObjectMapper objectMapper = new ObjectMapper();
AddressObject addressObject = new AddressObject();
Street street = new Street();
street.setAddressLine1("street1");
street.setAddressLine2("street2");
addressObject.setStreetLine(street);
addressObject.setCity("china");
String addressStr = objectMapper.writeValueAsString(addressObject);
AddressList addressList = objectMapper.readValue(addressStr, AddressList.class);
}
Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
at [Source: (String)"{"streetLine":{"addressLine1":"street1","addressLine2":"street2"},"city":"china","state":null,"postalCode":null,"county":null,"countryCode":null}"; line: 1, column: 15] (through reference chain: com.ysl.test.bo.AddressList["streetLine"])
错误原因:待转换的json字符串里面(如AddressObject里面的streetLine属性)为Object类型的时候,而反序列化中提供的class文件 对应的字段为List属性。
补充:
List与数组的序列化后的json字符串是一样的,由此他们之间可以互相反序列化。