java.lang.IllegalStateException:预期为 BEGIN_OBJECT,但在第 1 行第 62 列处为 STRING
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20376207/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 62
提问by karansingh1487
I am facing a problem about the GSON json to Java. I looked up many posts here, but I cannot find the solution for my question. So I list my problem here.I am trying to get the data there is a Map in json but I am not able to retrieve the data . In my log I am able to see that only this much data is coming then it throws the exception . Someone please guide me a way through. Thanks very much !
我面临关于 GSON json 到 Java 的问题。我在这里查了很多帖子,但找不到我的问题的解决方案。所以我在这里列出我的问题。我试图获取数据,json 中有一个 Map 但我无法检索数据。在我的日志中,我能够看到只有这么多数据来了,然后它抛出了异常。有人请指导我通过。非常感谢 !
Here is my Json Data on hitting the URL from the Android app i am working on
这是我正在处理的 Android 应用程序中点击 URL 的 Json 数据
EDIT
编辑
{
"success" : true,
"messages" : {
"success" : [
"SEARCH_QUERY_SUCCESS"
]
},
"session" : {
"id" : "cn694ivr8bmqnrveh9n8841oh7",
"expire" : "",
"YII_CSRF_TOKEN" : "4fa0ae103b547836241f5278311839b407050919"
},
"metadata" : {
"product_count" : "4458",
"category_ids" : "3",
"results" : [{
"id" : "105089",
"data" : {
"sku" : "MA851AA10ZLX",
"name" : "Alexa Mid Rise Super Skinny Leg",
"new-product" : false,
"url" : "http:\/\/theiconic.bugfoot.de\/mobile-api\/Alexa-Mid-Rise-Super-Skinny-Leg-105089.html",
"simples" : {
"MA851AA10ZLX-406437" : {},
"MA851AA10ZLX-406438" : {},
"MA851AA10ZLX-406439" : {},
"MA851AA10ZLX-406440" : {},
"MA851AA10ZLX-406441" : {},
"MA851AA10ZLX-406442" : {},
"MA851AA10ZLX-406443" : {},
"MA851AA10ZLX-406444" : {
"meta" : {
"sku" : "MA851AA10ZLX-406444",
"price" : "149.99",
"caching_hash" : "78ddaaf930f8bd0e0bf595c25643683d",
"shipment_cost_item" : "0.00",
"shipment_cost_order" : "0.00",
"tax_percent" : "10.00",
"quantity" : "2",
"cost" : "64.09",
"size_brand" : "W31\/L34",
"size" : "W31\/L34",
"size_position" : "200",
"3hours_shipment_available" : true,
"estimated_delivery" : "",
"estimated_delivery_position" : ""
},
"attributes" : {
"sort_order" : "0",
"size" : "W31\/L34"
}
}
}
}
}
]
}
}
Edit
编辑
This is my network class used for parsing
这是我用于解析的网络类
String jsonString = null;
try {
HttpGet httppost = new HttpGet(URL);
HttpClient httpClient = new DefaultHttpClient();
if (httpClient != null) {
HttpResponse response = httpClient.execute(httppost);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent(), "UTF-8"));
jsonString = reader.readLine();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(jsonString);
if (jsonString != null) {
Bean obj=new Gson().fromJson(jsonString, Bean.class);
Message msg = new Message();
msg.obj = obj;
responseHandler.sendMessage(msg);
//obj can be sent to a handler
}
}
}
This is Simples Bean class containing a Map
这是包含 Map 的 Simples Bean 类
public class Simples {
private Map<String, KeyMap> keyMap;
public Map<String, KeyMap> getKeyMap() {return keyMap;}
public void setKeyMap(Map<String, KeyMap> keyMap) {this.keyMap = keyMap;}}
This is my KeyMap Bean class
这是我的 KeyMap Bean 类
public class KeyMap {
private Meta meta;
private Attributes attributes;
public Meta getMeta() {
return meta;
}
public void setMeta(Meta meta) {
this.meta = meta;
}
public Attributes getAttributes() {
return attributes;
}
public void setAttributes(Attributes attributes) {
this.attributes = attributes;
}
}
回答by Asif Bhutto
Actually your were getting error BEGIN_OBJECT but was STRING
because gson was expecting object not the string, also it is an object in json, you have wrong mapped your classes in Bean class, and you have not posted the Bean,Simple class glue code here.
实际上,您收到错误BEGIN_OBJECT but was STRING
是因为 gson 期望的是对象而不是字符串,它也是 json 中的对象,您在 Bean 类中错误地映射了您的类,并且您没有在此处发布 Bean,Simple class 胶水代码。
You JSON model classes can be mapped as like this
您可以像这样映射 JSON 模型类
public class ProductInfo {
private boolean success;
private Map<String, String[]> messages;
private SessionData session;
private MetaData metadata;
}
public class SessionData {
private String id;
private String expire;
private String YII_CSRF_TOKEN;
}
public class MetaData {
private String product_count;
private String category_ids;
private List<Result> results;
}
public class Result {
private String id;
private Data data;
}
public class Data {
private String sku;
private String name;
@SerializedName(value = "new-product")
private String newProduct;
private String url;
Map<String, KeyMap> simples;
}
public class KeyMap {
private Meta meta;
private Attributes attributes;
}
public class Meta {
private String sku;;
private String price;
private String caching_hash;
private String shipment_cost_item;
private String shipment_cost_order;
private String tax_percent;
private String quantity;
private String cost;
private String size_brand;
private String size;
private String size_position;
@SerializedName(value = "3hours_shipment_available")
private String hours_shipment_available;
private String estimated_delivery;
private String estimated_delivery_positio;
}
public class Attributes {
private String sort_order;
private String size;
}
Finally de-serialize it
最后反序列化它
ProductInfo productInfo = gson.fromJson(reader, ProductInfo.class);
Enjoy :)
享受 :)