現在、Android上のWebサービスへの接続に問題があります。 jackson-core/databind/annotation-2.2.4とSpring RESTWebServiceを使用します。ブラウザからURLにアクセスすると、JSONレスポンスが表示されます:(サーバーが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>();
私はこことグーグルで見てきましたが、まだこの時点で何が欠けているのかわかりません。
どんな回答も大いに役立ちます。
よろしく。
@ UPDATE
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 ]
} ]
} ]
要求はまだ機能しません-エラーは同じです。
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));
投稿した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]
}
]
}
]