Spring Webservice에서 START_ARRAY 토큰에서 개체의 인스턴스를 역직렬화할 수 없습니다.
현재 안드로이드의 웹 서비스에 접속하는 데 문제가 있습니다.Jackson-core/databind/annotation-2.2.4 및 Spring REST Web Service를 사용합니다.브라우저에서 URL에 접속하면 JSON 응답을 볼 수 있습니다(서버 return List\).샵\의 외관:)
[{"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);
여기서 Shop Container는 다음과 같습니다.
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>();
여기와 구글을 찾아봤지만 아직 뭘 놓쳤는지 모르겠어요.
어떤 답변이든 큰 도움이 될 것입니다.
안부 전해요.
@업데이트
JSON은 Request Method에 잭슨의 Object Mapper를 사용하여 수정했습니다.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 ]
} ]
} ]
요청이 여전히 작동하지 않습니다. 오류는 동일합니다.
json에 배열이 포함되어 있지만 개체로 구문 분석하려고 합니다.이 오류는 개체가 다음 문자로 시작해야 하기 때문에 발생합니다.{
.
넌 두가지 옵션이 있다 :
이 모든 것을 없앨 수 있습니다.
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));
투고하신 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]
}
]
}
]
저도 비슷한 문제가 있었습니다.spring-boot-starter-data-redis
제 실장에서는, 다음과 같은 제안을 받았습니다.@Bean
위해서RedisTemplate
다음과 같습니다.
@Bean
public RedisTemplate<String, List<RoutePlantCache>> redisTemplate(RedisConnectionFactory connectionFactory) {
final RedisTemplate<String, List<RoutePlantCache>> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(RoutePlantCache.class));
// Add some specific configuration here. Key serializers, etc.
return template;
}
수정은, 다음의 배열을 지정하는 것이었습니다.RoutePlantCache
다음과 같습니다.
template.setValueSerializer(new Jackson2JsonRedisSerializer<>(RoutePlantCache[].class));
예외는 다음과 같습니다.
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `[...].RoutePlantCache` out of START_ARRAY token
at [Source: (byte[])"[{ ... },{ ... [truncated 1478 bytes]; line: 1, column: 1]
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1468) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1242) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1190) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:604) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:190) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:166) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526) ~[jackson-databind-2.11.4.jar:2.11.4]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3572) ~[jackson-databind-2.11.4.jar:2.11.4]
저 같은 경우에는 반품 타입이 잘못되어 있었습니다.반환 유형은 UserPost였지만 List여야 하며, 이는 위에서 설명한 이전 접근법에 대응합니다.
Before
fun getApiCallResponse(): UserPost {
val userPosts = HttpClientHelper.getUserPostsUrl()
val response = memberHttpHelper.get(userPosts)
return jacksonUtils.fromJson(response, object :
TypeReference<ArrayList<UserPost>>() {})
}
After
fun getApiCallResponse(): List<UserPost> {
val userPosts = HttpClientHelper.getUserPostsUrl()
val response = memberHttpHelper.get(userPosts)
return jacksonUtils.fromJson(response, object :
TypeReference<ArrayList<UserPost>>() {})
}
언급URL : https://stackoverflow.com/questions/25510083/cannot-deserialize-instance-of-object-out-of-start-array-token-in-spring-webserv
'programing' 카테고리의 다른 글
Visual Studio 코드: 파일 중첩에서 .js.map 파일을 숨깁니다. (0) | 2023.04.06 |
---|---|
신속한 JSON 생성 (0) | 2023.04.06 |
앱 도메인은 Facebook 웹 게임 URL(https), 모바일 사이트 URL, 유니티 이진 URL, 사이트 URL 또는 보안 페이지 탭 URL 도메인과 일치해야 합니다. (0) | 2023.04.06 |
ASP에서 캐스케이드다운을 작성하는 가장 쉬운 방법입니다.C#이 있는 NET MVC 3 (0) | 2023.04.06 |
WordPress 자동 업데이트를 Git에 버전 컨트롤로 삽입하는 방법 (0) | 2023.04.06 |