当前位置: 首页 > 知识库问答 >
问题:

使用Gson解析json webservice响应(预期为BEGIN_OBJECT,但实际为BEGIN_ARRY)

长孙智刚
2023-03-14
{
"info": {
    "num_results": 2974,
    "limit": 100,
    "offset": 0,
    "query": "foo",
    "type": "track",
    "page": 1
},
"tracks": [
    {
        "album": {
            "released": "2009",
            "href": "spotify:album:1zCNrbPpz5OLSr6mSpPdKm",
            "name": "Greatest Hits",
            "availability": {
                "territories": "AD AR AT AU BE BG BO BR CA CH CL CO CR CY CZ DE DK DO EC EE ES FI FR GB GR GT HK HN HU IE IS IT LI LT LU LV MC MT MX MY NI NL NO NZ PA PE PH PL PT PY RO SE SG SI SK SV TR TW US UY"
            }
        },
        "name": "Everlong",
        "popularity": "0.79",
        "external-ids": [
            {
                "type": "isrc",
                "id": "USRW29600011"
            }
        ],
        "length": 249.986,
        "href": "spotify:track:07q6QTQXyPRCf7GbLakRPr",
        "artists": [
            {
                "href": "spotify:artist:7jy3rLJdDQY21OgRLCZ9sD",
                "name": "Foo Fighters"
            }
        ],
        "track-number": "3"
    }]
}
JsonParser parser = new JsonParser();
JsonObject jObject = parser.parse(jsonString).getAsJsonObject();
JsonArray jArray = jObject.get("tracks") .getAsJsonArray();


Gson gson = new Gson();
List<Track> trackArr = new ArrayList<Track>();

Type collectiontype = new TypeToken<Collection<Track>>(){}.getType();
Collection<Track> trackColl = gson.fromJson(jArray.toString(), collectiontype);

但是我得到了错误:com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:预期的BEGIN_OBJECT但是是BEGIN_ARRAY

我不明白为什么在尝试获取json字符串中的“tracks”对象whihc是一个数组[]时执行“getasjsonArray()”,而期望begin object。

'track'的列表是当我在一个循环中执行此操作以将所有的曲目放入一个数组时:

for (JsonElement jsonElement : jArray) {
  Type collectiontype = new TypeToken<Collection<Track>>(){}.getType();
  Collection<Track> trackCol = gson.fromJson(jsonElement, collectiontype);
  trackArr.add((Track) trackCol);

}

共有1个答案

戚飞虎
2023-03-14

您不必使用额外的库来解析JSON文件。还可以使用此链接以人类可读的方式读取JSON文件。

使用本机的,如下例所示:

进口:

import org.json.JSONArray;
import org.json.JSONObject;
JSONObject fileJSONObject = new JSONObject(response);

JSONObject infoJSONObject = fileJSONObject.getJSONObject("info");
JSONArray tracksJSONArray = fileJSONObject.getJSONArray("tracks");

//Parsing the info
String trackType = infoJSONObject.getString("type");
String trackLimit = infoJSONObject.getString("limit");
//The rest of attributes


//Parsing the track list
JSONObject object;
for(int i=0;i<tracksJSONArray.length();i++){
    object = tracksJSONArray.getJSONObject(i);
    String trackName = object.getString("name");
    //The rest of attributes

}
 类似资料:
  • 问题内容: 我在尝试将JSON解组到对象中时遇到GSON错误。错误( 应为BEGIN_OBJECT,但在第3行第22列处为STRING )指向下面输入的第3行。 我是否相对于Bean正确映射了JSON? 我输入的JSON看起来是这样的: 问题答案: 不,您没有正确映射它,因为您的json对象不是,它包含。 你可以创建一个类只是为了封装你,但它是清洁反序列化容器的使用 然后使用解析有趣的内容 并且我

  • 问题内容: 我在列表中仅收到一个项目时收到此错误。我在服务器端REST Web服务中使用Jersey,当List返回一个元素并且当我得到它时,我仅收到错误,但是当它包含多个元素时,它可以正常工作,这就是我的工作方式它: 为什么Jersey不发送包含一个项目的列表?这是球衣的虫子吗?有没有办法使它始终序列化为数组? 当Web服务返回0元素时,这是我的JSON数据: 当Web服务返回1元素时,这是我的

  • 我的Retrofit2调用出现以下异常: 学分类别:

  • 我将请求映射到类,如下所示: 有人能解释为什么我在请求中的数组没有与类A中的数组映射吗?

  • 我试图使用gson解析下面的json字符串,并且我得到了这个异常。 异常很明显,它期待一个对象(可能是Datapoint),但它遇到了一个数组。我确信是我的模型类导致了这个问题,但是我不明白我的模型类应该是什么样子才能解析json而不会失败。

  • 获取以下JSON的Gson解析的以下错误 11-05 15:34:00.882:w/system.err(28673):com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:应为BEGIN_OBJECT,但在第1行第5923列为BEGIN_ARRAY 我正在使用belo行解析序列化上面的JSON