【问题标题】:Android HTTPGet syntax misunderstanding, need help for interpreting it with GSONAndroid HTTPGet 语法误解,用 GSON 解释需要帮助
【发布时间】:2015-01-21 15:55:49
【问题描述】:

我正在尝试创建一个使用我学校 API 的项目。

首先,这是我从 API 调用 GET 命令时收到的响应:

Get projects
/projects GET

Response
[
    {
        "title": "Project1",
        "num": "1",
        "registered": 1,
        "type_acti": "Project"
    },
    {
        "title": "Project2",
        "num": "2",
        "registered": 1,
        "type_acti": "Project"
    },
    {
        "title": "Project3",
        "num": "3",
        "registered": 1,
        "type_acti": "Project"
    }
]

Gson 自动将我的“fileData”字符串解析为类。 FileData 是包含我的请求的完整响应的字符串。不用担心 fileData,我收到的字符串是 100% 好的,它适用于其他请求。

我告诉 GSON 解析 CreateGetProjects 类中的字符串。

GSONTest.java

public class GSONTest {
    public static void start() throws JSONException {
        Gson gson = new GsonBuilder().setPrettyPrinting().create();
        String fileData = NextActivity.getStr();
        Log.e("Bug1", "Here it crashes :( ");
        CreateGetProjects emp1 = gson.fromJson(fileData, CreateGetProjects.class);
        Log.e("Bug1", "After the crash!");
    }
}

我这样解释响应:将数据存储到私有成员(标题、注册等)中的“响应项目”列表

CreateGetProjects.java

public class CreateGetProjects {
    List<ResponsesProjects> responses;

    public List<ResponsesProjects> getResponses() {
        return responses;
    }

    public void setResponses(List<ResponsesProjects> responses) {
        this.responses = responses;
    }
}

ResponsesProjects.java

public class ResponsesProjects {
    private String title;
    private String num;
    private int registered;
    private String type_acti;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getRegistered() {
        return registered;
    }

    public void setRegistered(int registered) {
        this.registered= registered;
    }
}

我认为我的错误是关于我的 GET 响应的解释。正如您在 logcat 上看到的:

Error.logcat

Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
                atcom.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:775)
at com.google.gson.Gson.fromJson(Gson.java:724)
at com.google.gson.Gson.fromJson(Gson.java:696)

在我看来,有趣的一行是预期为 BEGIN_OBJECT 但在第 1 行第 2 列路径 $ 处为 BEGIN_ARRAY。

所以问题可能来自 CreateGetProjects.java。我认为它不喜欢这样: 列出响应; 它期待别的东西,我不知道是什么。我试过这个,但不起作用:

List<List<ResponsesProjects>> responses;

我需要您的帮助来了解 GSON 的期望,我是 GSON 的新手。

你认为我应该替换什么而不是我的列表“ResponsesProjects”

谢谢。

【问题讨论】:

  • 摆脱你的CreateGetProjects类,使用List&lt;ResponsesProjects&gt; res = gson.fromJson(fileData, new TypeToken&lt;List&lt;ResponsesProjects&gt;&gt;(){}.getType());
  • 这是因为你的json是一个数组,Gson只能反序列化成一个item的列表。
  • 感谢您的解释。 brb
  • 成功了,非常感谢!!

标签: java android http get gson


【解决方案1】:

尝试直接给 GSON 一个 List&lt;ResponsesProjects&gt; 而不是 CreateGetProjects:第一个确实是一个 list(所以 GSON 会期望一个数组),而第二个是一个 对象 包含一个属性,即一个列表。

或者您可以在请求响应周围添加{},将其包装到单个 Json 对象中

【讨论】:

  • 我使用了 njzk2 的答案:摆脱你的 CreateGetProjects 类,并使用 List res = gson.fromJson(fileData, new TypeToken>(){}.getType() );
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2012-03-31
相关资源
最近更新 更多