Java 预期 BEGIN_ARRAY 但在第 1 行第 2 列中是 BEGIN_OBJECT ..... 尝试在 Android 中使用 GSON 解析 JSON 时出错?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20835536/
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
Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 .....Error when trying to Parse JSON using GSON in Android?
提问by nida
i am newbie in android.this is JSONString i have stored locally in my project.
我是 android 的新手。这是我在我的项目中本地存储的 JSONString。
public class MainActivity extends Activity {
MenuFields menuFieldInstance[];
Gson gson = new Gson();
String jsonObjectString = "{\n\n\n [\n \"id\": 22,\n \"menu_id\": 1,\n \"field_type_id\": 1,\n \"c4w_code\": \"1234\",\n \"field_label\": \"Customer No\",\n \"field_values\": \"\",\n \"date_Created\": \"2012-09-16 05:11:23\",\n \"date_modified\": \"2013-11-20 10:33:23\",\n \"is_required\": 0,\n \"is_static\": 1,\n \"field_order\": 1\n ],\n [\n \"id\": 23,\n \"menu_id\": 1,\n \"field_type_id\": 1,\n \"c4w_code\": \"1234\",\n \"field_label\": \"Company Name\",\n \"field_values\": \"\",\n \"date_Created\": \"2012-09-16 05:11:56\",\n \"date_modified\": \"2013-11-20 10:33:23\",\n \"is_required\": 1,\n \"is_static\": 1,\n \"field_order\": 3\n ]\n\n}";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
Log.i("Json String for testing", "" + jsonObjectString);
}
private void getCustomerMenuFieldsData(String parameter) {
menuFieldInstance = gson.fromJson(jsonObjectString, MenuFields[].class);
for (int i = 0; i < jsonObjectString.length(); i++) {
Log.i("menuField Instance ", "" + menuFieldInstance[i].getId());
}
}
}
please ignore mistakes of curly braces. i am getting Error.Here is the Logcat:
请忽略花括号的错误。我收到错误。这是 Logcat:
12-30 23:30:29.190: E/AndroidRuntime(15833): FATAL EXCEPTION: AsyncTask #3
12-30 23:30:29.190: E/AndroidRuntime(15833): java.lang.RuntimeException: An error occured while executing doInBackground()
12-30 23:30:29.190: E/AndroidRuntime(15833): at android.os.AsyncTask.done(AsyncTask.java:299)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-30 23:30:29.190: E/AndroidRuntime(15833): at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:230)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.lang.Thread.run(Thread.java:856)
12-30 23:30:29.190: E/AndroidRuntime(15833): Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.google.gson.Gson.fromJson(Gson.java:815)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.google.gson.Gson.fromJson(Gson.java:768)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.google.gson.Gson.fromJson(Gson.java:717)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.google.gson.Gson.fromJson(Gson.java:689)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.survey.management.activity.MainActivity$RequestForCustomerMenuFields.getCustomerMenuFieldsData(MainActivity.java:480)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.survey.management.activity.MainActivity$RequestForCustomerMenuFields.doInBackground(MainActivity.java:456)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.survey.management.activity.MainActivity$RequestForCustomerMenuFields.doInBackground(MainActivity.java:1)
12-30 23:30:29.190: E/AndroidRuntime(15833): at android.os.AsyncTask.call(AsyncTask.java:287)
12-30 23:30:29.190: E/AndroidRuntime(15833): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-30 23:30:29.190: E/AndroidRuntime(15833): ... 5 more
12-30 23:30:29.190: E/AndroidRuntime(15833): Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:338)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:70)
12-30 23:30:29.190: E/AndroidRuntime(15833): at com.google.gson.Gson.fromJson(Gson.java:803)
12-30 23:30:29.190: E/AndroidRuntime(15833): ... 13 more
Error is on this Line:
错误在这一行:
menuFieldInstance = gson.fromJson(jsonObjectString,MenuFields[].class);
采纳答案by Devrim
Firstly your jsonString is not valid. You can test it at http://jsonviewer.stack.hu/. I've modified it a bit to make it valid:
首先,您的 jsonString 无效。您可以在http://jsonviewer.stack.hu/测试它。我对其进行了一些修改以使其有效:
final GsonBuilder builder = new GsonBuilder();
final Gson gson = builder.create();
String jsonObjectString ="{\"menu_fields\":[{\"id\": 22, \"menu_id\": 1, \"field_type_id\": 1, \"c4w_code\": \"1234\", \"field_label\": \"Customer No\", \"field_values\": \"\", \"date_created\": \"2012-09-16 05:11:23\", \"date_modified\": \"2013-11-20 10:33:23\", \"is_required\": 0, \"is_static\": 1, \"field_order\": 1 }, {\"id\": 23, \"menu_id\": 1, \"field_type_id\": 1, \"c4w_code\": \"1234\", \"field_label\": \"Company Name\", \"field_values\": \"\", \"date_created\": \"2012-09-16 05:11:56\", \"date_modified\": \"2013-11-20 10:33:23\", \"is_required\": 1, \"is_static\": 1, \"field_order\": 3 }]}";
try {
MenuFieldHolder menuFieldHolder= gson.fromJson(jsonObjectString, MenuFieldHolder.class);
Log.i("TAG", "Result: " + menuFieldHolder.toString());
} catch (Throwable t) {
t.printStackTrace();
}
And your MenuFieldHolder
and MenuField
classes should be like below:
你的MenuFieldHolder
和MenuField
类应该如下所示:
private class MenuFieldHolder {
@SerializedName("menu_fields")
private MenuField[] menuFields;
}
private class MenuField {
private int id;
@SerializedName("menu_id")
private int menuId;
@SerializedName("field_type")
private int fieldType;
@SerializedName("c4w_code")
private String c4wCode;
@SerializedName("field_label")
private String fieldLabel;
@SerializedName("field_values")
private String fieldValues;
@SerializedName("date_created")
private String dateCreated;
@SerializedName("date_modified")
private String dateModified;
@SerializedName("is_required")
private int isRequired;
@SerializedName("is_static")
private int isStatic;
@SerializedName("field_order")
private String fieldOrder;
}
or without SerializedName
annotation(I prefer above. Because using camel case field names is a best practice for Java):
或不带SerializedName
注释(我更喜欢上面的。因为使用驼峰式字段名称是 Java 的最佳实践):
private class MenuFieldHolder {
private MenuField[] menu_fields;
}
private class MenuField {
private int id;
private int menu_id;
private int field_type;
private String c4w_code;
private String field_label;
private String field_values;
private String date_created;
private String date_modified;
private int is_required;
private int is_static;
private String field_order;
}