fasterxml-jackson发生Can not deserialize instance of的原因

背景

       项目中使用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字符串是一样的,由此他们之间可以互相反序列化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值