Spring Webservice의 START_ARRAY 토큰에서 개체의 인스턴스를 역 직렬화 할 수 없습니다.
현재 Android에서 내 웹 서비스에 연결하는 데 문제가 있습니다. jackson-core / databind / annotation-2.2.4 및 Spring RESTWebService를 사용합니다. 브라우저에서 URL에 액세스하면 JSON 응답을 볼 수 있습니다. (server return List \ Shop \은 다음과 같습니다.)
[{"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:
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
내 서버 요청
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
ShopContainer response = restTemplate.getForObject(url, ShopContainer.class);
ShopContainer는 다음과 같습니다.
public class ShopContainer {
private List<Shop> shops;
Shop, Address 및 Shoe의 구조는 다음과 같습니다 (게터와 세터를 생략했습니다).
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>();
나는 여기와 구글에서 보았지만 여전히 내가 무엇을 놓치고 있는지 알 수 없다.
어떤 답변이라도 큰 도움이 될 것입니다.
문안 인사.
@최신 정보
RequestMethod.GET과 함께 jackson의 ObjectMapper를 사용하여 JSON을 수정했습니다. 이제 문자열을 반환합니다.
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 ]
} ]
} ]
Request still doesn't work - error is the same.
Your json contains an array, but you're trying to parse it as an object. This error occurs because objects must start with {
.
You have 2 options:
You can get rid of the
ShopContainer
class and useShop[]
insteadShopContainer response = restTemplate.getForObject( url, ShopContainer.class);
replace with
Shop[] response = restTemplate.getForObject(url, Shop[].class);
and then make your desired object from it.
You can change your server to return an object instead of a list
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(list);
replace with
return mapper.writerWithDefaultPrettyPrinter().writeValueAsString( new ShopContainer(list));
Taking for granted that the JSON you posted is actually what you are seeing in the browser, then the problem is the JSON itself.
The JSON snippet you have posted is malformed.
You have posted:
[{
"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]
}]
while the correct JSON would be:
[{
"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]
}
]
}
]
'Development Tip' 카테고리의 다른 글
페이지를 새로 고치지 않고 양식 데이터를 PHP로 전달하는 AJAX로 양식 제출 (0) | 2020.12.14 |
---|---|
Eclipse의 gcc C ++ 컴파일러 버전을 어떻게 확인합니까? (0) | 2020.12.14 |
MySQL Workbench 자동 증가 비활성화 (0) | 2020.12.14 |
Windows 용 Docker 실행, 포트 노출시 오류 (0) | 2020.12.14 |
C ++로 텍스트 파일을 읽는 가장 우아한 방법은 무엇입니까? (0) | 2020.12.14 |