【问题标题】:GSON Android JSON parsning errorGSON Android JSON 解析错误
【发布时间】:2011-10-24 12:00:36
【问题描述】:

我有一个 ASP.NET Web 服务,我从我的 Android 应用程序中调用它并得到一个包含此 JSON 数据的字符串:

{
    "d": [{
        "__type": "Trafikverket_API.Models.Trafiklage",
        "TagGrupp": "44be2cce-3055-4d22-aaf2-00e098b0422e",
        "Fran": "Gävle,Uppsala,Stockholm",
        "Till": "Norrköping,Linköping",
        "TrafikplatsNamn": "Nyköping C",
        "VisaAnkomst": "true",
        "InstalldAnkomst": "false",
        "InstalldAvgang": "false",
        "SparangivelseAvgang": "6",
        "AnmarkningarAvgang": "SJ Regional",
        "AnnonseratTagId": "249",
        "SparangivelseAnkomst": "6",
        "AnmarkningarAnkomst": "SJ Regional",
        "AnnonseradAnkomstTid": "21:50",
        "AnnonseradAvgangTid": "21:53",
        "BeraknadAvgangTid": null,
        "BeraknadAnkomstTid": null,
        "AnnonseradTidpunktAvgang": "2011-10-23T21:53:00+02:00"
    }, {
        "__type": "Trafikverket_API.Models.Trafiklage",
        "TagGrupp": "eae407a9-61ba-43f4-9c53-c666c2a3f117",
        "Fran": "Stockholm,Södertälje",
        "Till": "Norrköping,Linköping",
        "TrafikplatsNamn": "Nyköping C",
        "VisaAnkomst": "true",
        "InstalldAnkomst": "false",
        "InstalldAvgang": "false",
        "SparangivelseAvgang": "6",
        "AnmarkningarAvgang": "SJ Regional",
        "AnnonseratTagId": "251",
        "SparangivelseAnkomst": "6",
        "AnmarkningarAnkomst": "SJ Regional",
        "AnnonseradAnkomstTid": "22:52",
        "AnnonseradAvgangTid": "22:54",
        "BeraknadAvgangTid": null,
        "BeraknadAnkomstTid": null,
        "AnnonseradTidpunktAvgang": "2011-10-23T22:54:00+02:00"
    }, ..... ]
}

我有一个名为 StationInfo 的对象,如下所示:

public class DataModel 
{
    public Boolean VisaAnkomst;
    public String TagGrupp;
    public String Fran;
    public String Till;
    public String TrafikplatsNamn;
    public Boolean InstalldAnkomst;
    public Boolean InstalldAvgang;
    public String SparangivelseAvgang;
    public String AnmarkningarAvgang;
    public Integer AnnonseratTagId;
    public String SparangivelseAnkomst;
    public String AnmarkningarAnkomst;
    public String AnnonseradAnkomstTid;
    public String AnnonseradAvgangTid;
    public String BeraknadTidpunktAnkomst;
    public String BeraknadTidpunktAvgang;
    public String VerkligAnkomstTid;
    public String VerkligAvgangTid;
    public String BeraknadAvgangTid;
    public String BeraknadAnkomstTid;
    public String AnnonseradTidpunktAvgang;
    public String VerkligTidpunktAnkomst;
}

当我运行这个时:

Gson gson = new Gson();
DataModel[] stationInfos = gson.fromJson(result, DataModel[].class);

我得到了这个异常:

com.google.gson.JsonParseException: Expecting object but found array

我想我需要一些与对象“d”匹配的对象,但我该怎么做呢?

【问题讨论】:

  • 尝试添加新类class DotNetDataModel { public DataModel[] d; }并像这样使用DotNetDataModel [] resp = gson.fromJson(result, DotNetDataModel.class); DataModel[] stationInfos = resp.d;

标签: android asp.net json gson


【解决方案1】:

我建议你实现内置的 JSON 类,而不是使用 Gson:

JSONObject obj;
try {
    obj = new JSONObject("yourJsonData");
    JSONArray objD = obj.getJSONArray("d");  // getting your "d" array from json data           
    JSONObject subObject;

    for(int i=0; i<objD.length(); i++)
    {
        subObject = objD.getJSONObject(i); // getting one by one objects from Array
    }
} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

【讨论】:

  • Quest.: "我想买一辆摩托车,我应该选择哪辆?" ...... Ans.:“不要买摩托车,买汽车......”
  • @Selvin 如果您已经拥有汽车(内置类),为什么还要去借摩托车(第 3 方 API)。
  • 也许他不想堵车(绑定到特定的类而不编码)
【解决方案2】:

您需要将保存数据的类的结构调整为 JSON 响应的结构。由于“d”是包含您的元素的数组,因此您在 DataModel 类中声明的所有内容都必须是上级类的 List 条目的“一部分”,例如 Response

public class Response {
  List<DataModel> data;   //with DataModel as defined by you
}

用法:

Response result = gson.fromJson(json_responseString, Response.class);
for (Response.DataModel entry: result.data) {
  //do something with each entry
}

【讨论】:

    【解决方案3】:

    您的数组在“d”变量中,您需要先将其提取出来

    【讨论】:

      【解决方案4】:

      如果“结果”是您的主要 json 对象,那么对于 json 数组中的所有对象,您必须使用如下所示的循环

      for(int i=0;i<result.getJSONArray("d").length();i++)
              {
                  DataModel[] obj=new Gson().fromJson(result.getJSONArray("d").getJSONObject(i).toString(), VteamsListing.class);
              }
      

      【讨论】:

        猜你喜欢
        • 2017-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多