Json 异常:Can not deserialize instance of xx out of START_ARRAY token

本文介绍了一个关于RESTful API中JSON数据解析的问题及解决方案。当服务器接收到客户端发送的JSON数组时,原本期望的是一个对象而非数组,导致了类型转换异常。通过调整服务器端的解析逻辑,将JSON数组转化为对象数组并取第一个元素,成功解决了该问题。

Server:

01@RequestMapping(value = { "/hygiene/{phone}" }, method = {RequestMethod.POST },produces="application/json")
02    @ResponseBody
03    public PhoneResult hygiene(@PathVariable("phone")String phoneObject) {
04        PhoneResult result = new PhoneResult();
05        try {
06            ObjectMapper mapper = new ObjectMapper();
07            Phone phone = mapper.readValue(phoneObject, Phone.class);
08            result.setRawPhoneNumber(phone.getPhoneNumber());
09            result.setFormat("4+4+4");
10            result.setCleanInternationalNumber("86 0513 23234442");
11            result.setCleanNationalNumber("0513 23423423");
12            result.setPreferredPresentation("513 234234234");
13        }catch (Exception e) {
14            e.printStackTrace();
15            result.setCleanInternationalNumber("error");
16        }
17         
18        return result;
19    }

 

Client:

 

1MultiValueMap<String,Object> dataMap2 = new LinkedMultiValueMap<String, Object>();
2    Phone p = new Phone();
3    p.setPhoneNumber("0513 23423423");
4    dataMap2.add("phone", JsonUtil.javaToJson(p));
5    HttpEntity<Object> entity2 = new HttpEntity<Object>(dataMap2); 
6    PhoneResult result = this.restTemplate.postForObject("http://localhost:8080/restServer/helloworld/hygiene/{phone}.spring", entity2,  PhoneResult.class, dataMap2);

 

1public static String javaToJson(Object o) throws Exception{
2        StringWriter writer = new StringWriter();
3        ObjectMapper mapper = new ObjectMapper();
4        mapper.writeValue(writer, o);
5        String json=writer.toString();
6        return json;
7    }

 

 遇到的异常: server端转化json失败:

1org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of com.pojo.Phone out of START_ARRAY token
2 at [Source: java.io.StringReader@55afbf49; line: 1, column: 1]
3    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
4    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198)
5    at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeUsingCreator(BeanDeserializer.java:565)
6    at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:365)
7    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2391)
8    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1591)
9    at com.acxiom.rest.controller.HelloWorldController.hygiene(HelloWorldController.java:52)

 

Debug了一下程序,发现传进来的json字符串是数组格式的:

[{"phoneNumber":"0513 XXXXX","phoneType":"1","countryCode":"1","geoOption":"1","defaultOption":"1","geoLat":"1","geoLong":"1"}]

 

果断修改了Server端代码:

 

1ObjectMapper mapper = new ObjectMapper();
2Phone phone = mapper.readValue(phoneObject, Phone[].class)[0];

 

问题解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值