【问题标题】:Parsing json webservice Response with Gson (Expected BEGIN_OBJECT but was BEGIN_ARRAY)使用 Gson 解析 json webservice 响应(预期为 BEGIN_OBJECT 但为 BEGIN_ARRAY)
【发布时间】:2014-02-06 17:06:30
【问题描述】:

我正在尝试解析 spotify 网络服务响应以获取艺术家的曲目,如下所示:

{
"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"
    }]
}

我正在使用 Gson 库来执行此操作。到目前为止,我已经在我的 java 代码中尝试过这个:

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: Expected BEGIN_OBJECT but was BEGIN_ARRAY

我不明白为什么在尝试获取 json 字符串中的“tracks”对象时,如果我正在执行“getAsJsonArray()”,它会期望开始对象是一个数组 []。

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

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

}

我在这里做错了什么? 我很感激任何指导。

【问题讨论】:

    标签: java android json web-services gson


    【解决方案1】:

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

    以 Native 为例:

    进口:

    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
    
    }
    

    我建议您创建一个轨道class,其中包含所有需要的属性及其settergetter,并在每个轨道的解析结束时创建一个新轨道。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      你可以使用我的库来解决这个问题。例如你可以做到。

      private static List<Object> SpotifyTest()
      {
          InformationHandler informationHandler   = null;
          Injector injector                       = Guice.createInjector(new Module());
          informationHandler                      = injector.getInstance(SpotifyService.class);
          informationHandler.executeWithValue("la bamba");
          return informationHandler.getDataModel();
      }
      

      该解决方案返回一个包含大量 HashMap 的 List,其中每个 key 是服务上 key 的枚举,枚举器是:

      public enum SpotifyKey
      {
          ALBUM_RELEASED,
          ALBUM_HREF,
          ALBUM_NAME,
          ALBUM_AVAILABILITY,
          NAME,
          POPULARITY,
          LENGTH,
          HREF,
          ARTIST_HREF,
          ARTIST_NAME,
          TRACK_NUMBER,
          ID
      } 
      

      也可以在github上查看代码https://github.com/WeCodeMx/WCMPopularService/tree/develop

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-10
        • 1970-01-01
        • 2016-09-26
        • 2012-03-24
        • 1970-01-01
        • 2015-01-01
        相关资源
        最近更新 更多