Cannot deserialize instance of object out of START_ARRAY token in Spring Webservice
我目前无法在android上连接到我的网络服务。 我使用jackson-core / databind / annotation-2.2.4和Spring RESTWebService。 如果从浏览器访问URL,则可以看到JSON响应:(服务器返回List Shop 看起来像:)
1 2 3 4 | [{"name":"shopqwe","mobiles":[],"address":{"town":"city", "street":"streetqwe","streetNumber":"59","cordX":2.229997,"cordY":1.002539}, "shoe" [{"shoeName":"addidas","number":"631744030","producent":"nike","price":999.0, "sizes":[30.0,35.0,38.0]}] |
从客户端端点(Android应用程序),我收到此错误消息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 08-26 17:43:07.406: E/AllShopsAsyc(28203): Could not read JSON: Can not deserialize instance of com.auginzynier.data.ShopContainer out of START_ARRAY token 08-26 17:43:07.406: E/AllShopsAsyc(28203): at [Source: com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream@41efbd48; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.auginzynier.data.ShopContainer out of START_ARRAY token 08-26 17:43:07.406: E/AllShopsAsyc(28203): at [Source: com.android.okhttp.internal.http.HttpTransport$ChunkedInputStream@41efbd48; line: 1, column: 1] 08-26 17:43:07.406: E/AllShopsAsyc(28203): org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Can not deserialize instance of com.auginzynier.data.ShopContainer out of START_ARRAY token |
我的伺服器要求
1 2 3 | RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); ShopContainer response = restTemplate.getForObject(url, ShopContainer.class); |
ShopContainer在哪里:
1 2 | public class ShopContainer { private List<Shop> shops; |
Shop,Address和Shoe的结构为:(我省略了getter和setter):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class Shop { @JsonProperty("name") private String name; @JsonProperty("mobiles") private List<String> mobiles = new ArrayList<String>(); @JsonProperty("address") private Address address; @JsonProperty("shoe") private List<Shoe> shoe = new ArrayList<Shoe>(); public class Address { @JsonProperty("town") private String town; @JsonProperty("street") private String street; @JsonProperty("streetNumber") private String streetNumber; @JsonProperty("cordX") private Double cordX; @JsonProperty("cordY") private Double cordY; public class Shoe { @JsonProperty("shoeName") private String shoeName; @JsonProperty("number") private String number; @JsonProperty("producent") private String producent; @JsonProperty("price") private Double price; @JsonProperty("sizes") private List<Double> sizes = new ArrayList<Double>(); |
我已经在这里和Google上进行了搜索,但仍然无法弄清我目前所缺少的内容。
任何回应将大有帮助。
问候。
@更新
我已经通过将Jackson的ObjectMapper与RequestMethod.GET结合使用来修复了JSON。 现在,它返回一个字符串。
1 2 3 4 5 6 | list is List<Shop> ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(new File("D:\\Android\\shop.json"), list); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(list)); return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(list); |
控制台中的JSON如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [ { "name" :"shopqwe", "mobiles" : [ ], "address" : { "town" :"city", "street" :"streetqwe", "streetNumber" :"59", "cordX" : 2.229997, "cordY" : 2.002539 }, "shoe" : [ { "shoeName" :"addidas", "number" :"631744033", "producent" :"nike", "price" : 10.0, "sizes" : [ 30.0, 35.0, 38.0 ] } ] } ] |
请求仍然不起作用-错误是相同的。
您的json包含一个数组,但是您尝试将其解析为一个对象。
发生此错误的原因是对象必须以
您有2个选择:
您可以摆脱
1 2 | ShopContainer response = restTemplate.getForObject( url, ShopContainer.class); |
用。。。来代替
1 | Shop[] response = restTemplate.getForObject(url, Shop[].class); |
然后从中制作所需的对象。
您可以更改服务器以返回对象而不是列表
1 | return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(list); |
用。。。来代替
1 2 | return mapper.writerWithDefaultPrettyPrinter().writeValueAsString( new ShopContainer(list)); |
理所当然,您发布的JSON实际上就是您在浏览器中看到的,那么问题就出在JSON本身上。
您发布的JSON代码段格式错误。
您已发布:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [{ "name" :"shopqwe", "mobiles" : [], "address" : { "town" :"city", "street" :"streetqwe", "streetNumber" :"59", "cordX" : 2.229997, "cordY" : 1.002539 }, "shoe"[{ "shoeName" :"addidas", "number" :"631744030", "producent" :"nike", "price" : 999.0, "sizes" : [30.0, 35.0, 38.0] }] |
而正确的JSON将是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [{ "name" :"shopqwe", "mobiles" : [], "address" : { "town" :"city", "street" :"streetqwe", "streetNumber" :"59", "cordX" : 2.229997, "cordY" : 1.002539 }, "shoe" : [{ "shoeName" :"addidas", "number" :"631744030", "producent" :"nike", "price" : 999.0, "sizes" : [30.0, 35.0, 38.0] } ] } ] |