【问题标题】:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 1com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:应为 BEGIN_ARRAY,但在第 1 行第 1 列为 STRING
【发布时间】:2020-06-21 14:06:59
【问题描述】:
GsonBuilder builder = new GsonBuilder();
Gson mGson = builder.create();
spinnerData = Arrays.asList(mGson.fromJson(response, Item.class));

执行此代码后,spinnerdata 列表的大小显示为 0。我的响应是:

{"结果":[{"item_code":"r2010","item_name":"rice"},{"item_code":"w2010","item_name":"wheat"},{"item_code": "p2010","item_name":"paddy"},{"item_code":"b2010","item_name":"bran"}]}

我的 item.java 代码是:

package com.example.booking;

import com.google.gson.annotations.SerializedName;
public class Item {
     @SerializedName("item_code")
     private String item_code;
     @SerializedName("item_name")
     private String item_name;

    public Item() {
    }

    public Item(String item_code, String item_name) {
        this.item_code = item_code;
        this.item_name = item_name;
    }

    public void setCode(String item_code) {
        this.item_code = item_code;
    }

    public void setName(String item_name) {
        this.item_name = item_name;
    }

    public String getCode() {
        return this.item_code;
    }

    public String getName() {
        return this.item_name;
    }
}

错误显示:

E/AndroidRuntime: 致命异常: main 进程:com.example.booking,PID:12452 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: 预期 BEGIN_OBJECT 但在第 1 行第 1 列是 STRING 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176) 在 com.google.gson.Gson.fromJson(Gson.java:803) 在 com.google.gson.Gson.fromJson(Gson.java:768) 在 com.google.gson.Gson.fromJson(Gson.java:717) 在 com.google.gson.Gson.fromJson(Gson.java:689) 在 com.example.booking.MainActivity$2.onResponse(MainActivity.java:82) 在 com.example.booking.MainActivity$2.onResponse(MainActivity.java:77) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:179) 在 android.app.ActivityThread.main(ActivityThread.java:5730) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:681) 引起:java.lang.IllegalStateException:预期 BEGIN_OBJECT 但在第 1 行第 1 列是 STRING 在 com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165) 在 com.google.gson.Gson.fromJson(Gson.java:803) 在 com.google.gson.Gson.fromJson(Gson.java:768) 在 com.google.gson.Gson.fromJson(Gson.java:717) 在 com.google.gson.Gson.fromJson(Gson.java:689) 在 com.example.booking.MainActivity$2.onResponse(MainActivity.java:82) 在 com.example.booking.MainActivity$2.onResponse(MainActivity.java:77) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) 在 com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) 在 com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:179) 在 android.app.ActivityThread.main(ActivityThread.java:5730) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:681)

应用更改后

【问题讨论】:

  • 嗨 Suneha Ghosh,欢迎来到 stackoverflow!请发布Item 类的源代码。

标签: android


【解决方案1】:

请仔细检查您的回复。这里,result 是一个对象,而不是一个数组。 result 对象内有一个数组。所以你需要将 JSON 解析成一个对象。然后你可以从result 得到一个数组。我已经从您给定的响应和输出中给出了一个示例实体 -

您可以使用给定的代码,但需要稍作改动 -

String response = "{\"result\":[{\"item_code\":\"r2010\",\"item_name\":\"rice\"}," +
                "{\"item_code\":\"w2010\",\"item_name\":\"wheat\"},{\"item_code\":\"p2010\"," +
                "\"item_name\":\"paddy\"},{\"item_code\":\"b2010\",\"item_name\":\"bran\"}]}";

        GsonBuilder builder = new GsonBuilder();
        Gson mGson = builder.create();
        Item spinnerData = mGson.fromJson(response, Item.class);

        List<Result> list = spinnerData.getResult();

这里,list 将是您的实际结果。

您的实体与您的回复不正确。下面的代码是给定响应 JSON 的实际实体 -

public class Item {
    @SerializedName("result")
    private List<Result> result;

    public List<Result> getResult() { return result; }

    public void setResult(List<Result> result) { this.result = result; }
}

class Result {
    @SerializedName("item_code")
    private String itemCode;

    @SerializedName("item_name")
    private String itemName;

    public void setItemCode(String itemCode){ this.itemCode = itemCode; }

    public String getItemCode(){ return itemCode; }

    public void setItemName(String itemName){ this.itemName = itemName; }

    public String getItemName(){ return itemName; }
}

【讨论】:

  • List list = spinnerData.getResult();此行显示无法解析符号。如果我这样做 List list = spinnerData.getResult();什么都没有显示
  • 错误已解决,但出现同样的问题。
  • 您能检查一下您的回复吗? Gson 一开始期望{,但得到"。请检查并让我知道。谢谢。
  • 这是我得到的响应 {"result":[{"item_code":"r2010","item_name":"rice"},{"item_code":"w2010","item_name ":"wheat"},{"item_code":"p2010","item_name":"paddy"},{"item_code":"b2010","item_name":"bran"}]}
  • 您在使用自己的Item 类吗?解析 JSON 期间可能缺少 en {。因为我的类和函数在你的项目中不起作用。请重新检查您的 @SerializedName 的每个属性。谢谢...
【解决方案2】:

另一种隐藏唯一属性是列表而不重写模型类的对象的解决方案(如果没有必要)

import com.google.gson.reflect.TypeToken;


spinnerData = mGson.fromJson(new JSONObject(response).getJSONArray("result").toString(), new TypeToken<Item>(){}.getType());

【讨论】:

  • 谢谢....但这表明无法解析 TokenType。有需要导入的库吗?
  • ops 我指的是 TypeToken
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 1970-01-01
  • 2017-01-19
  • 2013-04-29
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多