Ошибка синтаксического анализа GSON Android JSON - PullRequest
0 голосов
/ 24 октября 2011

У меня есть один веб-сервис ASP.NET, который я вызываю из моего приложения для 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", но как это сделать?я делаю это?

Ответы [ 4 ]

1 голос
/ 24 октября 2011

Вам необходимо адаптировать структуру ваших классов, которая будет хранить данные, к структуре ответа 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
}
1 голос
/ 24 октября 2011

Вместо использования Gson я бы предложил вам реализовать встроенные классы JSON:

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();
}
0 голосов
/ 24 октября 2011

Ваш массив находится внутри переменной "d", вам нужно сначала извлечь его

0 голосов
/ 24 октября 2011

если «result» является вашим основным объектом 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);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...