使用 JsonReader

Working with JsonReader

我正在开发 android 应读取此 json 字符串的应用程序:

{
"coord":{
       "lon":145.77,
       "lat":-16.92
},
"weather":[
          {
        "id":803,
        "main":"Clouds",
        "description":"broken clouds",
        "icon":"04n"
        }
        ],
  "base":"cmc stations"
}

与此类似。

我可以使用以下方法成功读取 "coord" 值:

public Coordinates readCoordinates(JsonReader reader) throws IOException{
    double longitude = 0.0;     // lon
    double latitude  = 0.0;     // lat

    reader.beginObject();

    while (reader.hasNext()){
        String nameToRead = reader.nextName();
        if(nameToRead.equals("lon")){
            longitude = reader.nextDouble();
        }else if (nameToRead.equals("lat")){
            latitude = reader.nextDouble();
        }else {
            reader.skipValue();
        }
    }
    reader.endObject();
    return (new Coordinates(longitude, latitude));
}

我有类似的阅读方法 "weather":

public Weather readWeather(JsonReader reader) throws IOException{
    int id = 0;
    String main         = "";
    String description  = "";
    String icon         = "";

    reader.beginObject();
    while (reader.hasNext()){
        String nameToRead = reader.nextName();
        if(nameToRead.equals("id")){
            id = reader.nextInt();
        }else if (nameToRead.equals("main")){
            main = reader.nextString();
        }else if (nameToRead.equals("description")){
            description = reader.nextString();
        }else if (nameToRead.equals("icon")){
            icon = reader.nextString();
        }else{
            reader.skipValue();
        }
    }
    reader.endObject();
    return (new Weather(id, main, description, icon));
}

我不断收到此异常消息Expected BEGIN_OBJECT but was BEGIN_ARRAY

如果我将 reader.beginObject() 更改为 reader.beginArray(),我会得到同样的错误。我也尝试过完全删除它,但出现了同样的错误。

我假设这是由于 [ 的引入引起的,但我不确定如何解决这个问题。如果有人知道请帮忙,我将不胜感激,谢谢。

在您的 gson 模型中 class 看看。根据 json

"weather":[
          {
        "id":803,
        "main":"Clouds",
        "description":"broken clouds",
        "icon":"04n"
        }
        ]

它应该被解析为 jsonArray 但我认为在你的模型中 class 你期望它是 jsonObject.

根据 json 使用 http://www.jsonschema2pojo.org/ 获得精确的 java 模型 class。

您没有得到 JSON 的结构。在 "weather" 之后是只有一个对象的数组。所以你的代码应该是

 jsonReader.beginArray();

                while( jsonReader.hasNext() ) {

                    jsonReader.beginObject();

                    while( jsonReader.hasNext() ) {

                       String nameToRead = reader.nextName();
    if(nameToRead.equals("id")){
        id = reader.nextInt();
    }else if (nameToRead.equals("main")){
        main = reader.nextString();
    }else if (nameToRead.equals("description")){
        description = reader.nextString();
    }else if (nameToRead.equals("icon")){
        icon = reader.nextString();
                        else {

                            jsonReader.skipValue();

                        }