0

假设我正在从 apijson中获取一些数组

[{"id":1,"title":"title","description":"description","vote":null,"created_at":"2013-11-12T21:08:10.922Z","updated_at":"2013-11-12T21:08:10.922Z"}]

我想从url检索这个json作为Some对象URL_Some

public class Some implements Serializable {

    private String id;
    private String title;
    private String description;
    private String vote;
    private String created_at;
    private String updated_at;
    }//with all getters and setters

.

public List<Some> getSome() throws IOException {
        try {
            HttpRequest request = execute(HttpRequest.get(URL_Some));
            SomeWrapper response = fromJson(request, SomeWrapper.class);
            Field[] fields = response.getClass().getDeclaredFields();
            for (int i=0; i<fields.length; i++)
            {
                try {
                    Log.i("TAG", (String) fields[i].get(response));
                } catch (IllegalAccessException e) {
                    e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                }
                Log.i("TAG", fields[i].getName());
            }
            if (response != null && response.results != null)
                return response.results;
            return Collections.emptyList();
        } catch (HttpRequestException e) {
            throw e.getCause();
        }
    }

并且SomeWrapper很简单

private static class SomeWrapper {

        private List<Some> results;
    }

问题是我不断收到这条消息

java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY

PS:我用

import com.google.gson.Gson;

import com.google.gson.GsonBuilder;

import com.google.gson.JsonParseException;
4

2 回答 2

1

你的 json 实际上应该是这样的:

{"results": [{"id":1,"title":"title","description":"description","vote":null,"created_at":"2013-11-12T21:08:10.922Z","updated_at":"2013-11-12T21:08:10.922Z"}]}

Gson 将尝试解析 json 并创建 SomeWrapper 对象。仅此一项就告诉 Gson 他将等待具有这种格式的 json,{...}因为他期待一个对象。但是,您改为传递了一个数组,这就是为什么它抱怨期望 BEGIN_OBJECT ( {) 但得到 BEGIN_ARRAY ( [)。之后,它会期望这个 json 对象有一个results字段,该字段将保存一个对象数组。

但是,您可以List<Some>直接创建而不需要包装类。为此,请改为:

Type type= new TypeToken<List<Some>>() {}.getType();
List<Some> someList = new GsonBuilder().create().fromJson(jsonArray, type);

在这种情况下,您可以使用您发布的原始 json 数组。

于 2013-11-13T03:54:16.963 回答
0

您发布的 JSON 是一个 JSON 数组,由它周围的方括号表示:[ ]。

您必须从 JSON 数组中读取第一个对象。

我个人将org.json包用于 Android JSON,并以如下方式解析我的 JSON:

private void parseJSON(String jsonString) {
JSONArray json;
    try {
        json = new JSONArray(jsonString);
        JSONObject jsonObject = jsonArray.getJSONObject(0);
        String id = jsonObject.getString("id");
    } catch (JSONException jsonex) {
        jsonex.printStackTrace();
    }
}

如果您的数组中有多个 JSON 对象,您可以使用简单的 for 循环(不是每个循环!)

于 2013-11-12T23:25:22.200 回答