Подтвердить что ты не робот

Невозможно десериализовать экземпляр объекта из токена START_ARRAY в Spring Webservice

В настоящее время у меня проблемы с подключением к веб-сервису на Android. Я использую jackson-core/databind/annotation-2.2.4 и Spring RESTWebService. Если я получаю доступ к URL-адресу из браузера, я могу увидеть ответ JSON: (серверный список возврата\магазин\выглядит так:)

[{"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) я получаю следующее сообщение об ошибке:

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:
co[email protected]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:
co[email protected]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

Мой запрос на сервер

RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ShopContainer response  = restTemplate.getForObject(url, ShopContainer.class);

где ShopContainer:

public class ShopContainer {
   private List<Shop> shops;

Структура магазина, адреса и обуви (я скучаю по этому адресу, получатели и сеттеры):

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, но до сих пор не могу понять, что мне не хватает в этот момент Любой ответ будет очень полезен.

С уважением.

@UPDATE

Я исправляю формат JSON с помощью jackson ObjectMaper в сервере RequestMetod.GET. Теперь он возвращает строку.

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 в консоли выглядит следующим образом:

[ {
  "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 ]
  } ]
} ]

Запрос все еще не работает - ошибка такая же.

4b9b3361

Ответ 1

Ваш json содержит массив, но вы пытаетесь его проанализировать как объект. Эта ошибка возникает из-за того, что объект должен начинаться с {.

У вас есть 2 варианта:

  • Вы можете избавиться от класса ShopContainer и вместо этого использовать Shop[]

    ShopContainer response  = restTemplate.getForObject(
        url, ShopContainer.class);
    

    заменить

    Shop[] response  = restTemplate.getForObject(url, Shop[].class);
    

    а затем создайте объект, который он или что вам нужно.

  • Вы можете изменить свой сервер для возврата объекта вместо списка

    return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(list);
    

    заменить

    return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(
        new ShopContainer(list));
    

Ответ 2

Принимая во внимание, что JSON, который вы опубликовали, на самом деле является тем, что вы видите в браузере, тогда проблема заключается в самом JSON.

Отредактированный вами фрагмент JSON неверен.

Вы отправили:

[{
        "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 будет:

[{
        "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]
            }
        ]
    }
]