期望BEGIN_ARRAY,但是在BEGIN_OBJECT第1行第2列.....当在Android中使用GSON解析JSON时出错? [英] Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 .....Error when trying to Parse JSON using GSON in Android?

查看:107
本文介绍了期望BEGIN_ARRAY,但是在BEGIN_OBJECT第1行第2列.....当在Android中使用GSON解析JSON时出错?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  public class MainActivity extends Activity { 
MenuFields menuFieldInstance [];

Gson gson = new Gson();

String jsonObjectString ={\\\
\\\
\\\
[\\\
\id \:22,\\\
\menu_id \:1,\\ \\ n \field_type_id \:1,\ n \c4w_code \:\1234 \,\\\
\field_label \:\Customer No \ ,\ \\ n \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, n \field_type_id \:1,\ n \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 \\\
] \\\\\ };

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
Log.i(用于测试的Json字符串,+ 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());
}
}
}

请忽略大括号的错误。
i得到Error.Here是Logcat:

  12-30 23:30:29.190:E / AndroidRuntime( 15833):致命异常:AsyncTask#3 
12-30 23:30:29.190:E / AndroidRuntime(15833):java.lang.RuntimeException:执行doInBackground()时发生错误
12-30 23:30:29.190:E / AndroidRuntime(15833):at android.os.AsyncTask $ 3.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):在java.util.concurrent.FutureTask.setException(FutureTask .java:124)
12-30 23:30:29.190:E / AndroidRuntime(15833):在java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:307)
12- 30 23:30:29.190:E / AndroidRuntime(15833):在java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-30 23:30:29.190:E / AndroidRuntime(15833) :在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)
12-30 23 :30:29.190:E / AndroidRuntime(15833):在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):在java.lang.Thread.run(Thread.java :856)
12-30 23:30:29.190:E / AndroidRuntime(15833):com.google.gson.JsonSyntaxException引发:java.lang.IllegalStateException:预期的BEGIN_ARRAY,但在BEGIN_OBJECT行1列2
12-30 23:30:29.190:E / AndroidRuntime(15833):com.google.gson.Gson.fromJson(Gson.java:815)
12-30 23:30:29.190: E / AndroidRuntime(15833):com.google.gson.Gson.fromJson(Gson.java:768)
12-30 23:30:29.190:E / AndroidRuntime(15833):com.google.gson .Gson.fromJson(Gson.java:717)
12-30 23:30:29.190:E / AndroidRuntime(15833):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):在android.os.AsyncTask $ 2.call(AsyncTask.java:287)
12-30 23:30: 29.190:E / AndroidRuntime(15833):在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):引起:java.lang.IllegalStateException:预期的BEGIN_ARRAY,但是BEGIN_OBJECT在第1行第2列
12-30 23 :30:29.190:E / AndroidRuntime(15833):com.google.gson.stream.JsonReader.begin Array(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):com.google.gson.Gson.fromJson(Gson.java:803)
12-30 23:30:29.190:E / AndroidRuntime(15833):... 13 more

错误在此行上:

  menuFieldInstance = gson.fromJson(jsonObjectString,MenuFields []。class); 


解决方案

首先,您的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 \:\公司名称\,\field_values \:\\,\date_created \:\2012-09-16 05:11:56 \,\date_modified \:\2013-11 -20:10:3​​3:23,\\is_required \:1,\is_static \:1,\field_order \:3}]};
尝试{
MenuFieldHolder menuFieldHolder = gson.fromJson(jsonObjectString,MenuFieldHolder.class);
Log.i(TAG,Result:+ menuFieldHolder.toString());
} catch(Throwable t){
t.printStackTrace();
}

并且您的 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;
}

或没有 SerializedName 注释(我更喜欢上面的内容,因为使用camel case字段名称是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;

私人字符串field_values;

private String date_created;

private String date_modified;

private int is_required;

private int is_static;

private String field_order;
}


i am newbie in android.this is JSONString i have stored locally in my project.

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:

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$3.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$1.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$2.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);

解决方案

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:

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:

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):

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;
}

这篇关于期望BEGIN_ARRAY,但是在BEGIN_OBJECT第1行第2列.....当在Android中使用GSON解析JSON时出错?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆