1

我正在尝试使用 GSON java 库从下面提供的 URL 中提取 JSON 值:http: //api.wunderground.com/api/b28d047ca410515a/forecast/q/-33.912,151.013.json

我已成功使用下面提供的代码从以下 URL 中提取数据:http: //api.wunderground.com/api/b28d047ca410515a/conditions/q/-33.912,151.013.json

代码:

   String url = "http://api.wunderground.com/api/b28d047ca410515a/conditions/q/-33.912,151.013.json";
   String url2 = "http://api.wunderground.com/api/b28d047ca410515a/forecast/q/-33.912,151.013.json";

            InputStream is = null;
            try {
                is = new URL(url).openStream();
                BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
                String jsonText = readAll(rd);

                JsonElement je = new JsonParser().parse(jsonText);

                System.out.println("Current Temperature:" + getAtPath(je, "current_observation/temp_c").getAsString() );


            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();

            } finally {
                try {
                    if (is != null)
                        is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } 

但是,我在尝试按照下面的代码从 url2 中提取时遇到异常,它似乎是一个更复杂的 json 来获取值,请问有什么帮助吗?

// below code not working

            weather_icon_url = getAtPath(je, "current_observation/icon_url").getAsString();

            is = new URL(url2).openStream();
            BufferedReader rd2 = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
            String jsonText2 = readAll(rd2);

            JsonElement je2 = new JsonParser().parse(jsonText2);

            System.out.println("max Temperature:" + getAtPath(je2, "forecast/simpleforecast/forecastday/high/celsius").getAsString() );

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();

        } finally {
            try {
                if (is != null)
                    is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } 

getAtPath 代码:

private static JsonElement getAtPath(JsonElement e, String path) {
        JsonElement current = e;
        String ss[] = path.split("/");
        for (int i = 0; i < ss.length; i++) {
            current = current.getAsJsonObject().get(ss[i]);
        }
        return current;
    }
4

2 回答 2

1

您面临的问题是因为getAtPath实施存在问题。

[{"date":{"epoch":"1459152000"...表示该方法尝试作为 JSONObject 访问的 JSONArray。因此IllegalStateException.

JsonObject com.google.gson.JsonElement.getAsJsonObject()

将此元素作为 JsonObject 获取的便捷方法。如果元素属于其他类型,则会导致 IllegalStateException。因此,最好在通过首先调用 isJsonObject() 确保此元素是所需类型之后使用此方法。

您可以更新和使用类似下面的内容,到目前为止它只返回第一个元素。

    private static JsonElement getAtPath(JsonElement e, String path) {
        JsonElement current = e;
        String ss[] = path.split("/");
        for (int i = 0; i < ss.length; i++) {
            if(current instanceof JsonObject){
                current = current.getAsJsonObject().get(ss[i]);
            } else if(current instanceof JsonArray){
                JsonElement jsonElement = current.getAsJsonArray().get(0);
                current = jsonElement.getAsJsonObject().get(ss[i]);
            }
        }
        return current;
    }
于 2016-03-28T10:56:19.807 回答
0

这应该有效:

System.out.println("max Temperature:" + getAtPath(je2, "forecast/simpleforecast/forecastday/high/celsius").getAsString() );
于 2016-03-28T07:18:04.177 回答