1

这是问题所在,我正在使用来自 Wunderground 的天气 APi,并且在使用 GSON 获取天气时遇到了麻烦。

import java.net.*;
import java.io.*;
import com.google.gson.*;

public class URLReader {

    public static URL link;

    public static void main(String[] args) {
        try{
            open();
            read();
        }catch(IOException e){}
    }

    public static void open(){
        try{
            link = new URL("http://api.wunderground.com/api/54f05b23fd8fd4b0/geolookup/conditions/forecast/q/US/CO/Denver.json");
        }catch(MalformedURLException e){}
    }

    public static void read() throws IOException{
        Gson gson = new Gson();

        // Code to get variables like humidity, chance of rain, ect...
    }
} 

这就是我所得到的,所以有人可以帮助我让这个东西工作。我需要能够解析特定变量而不仅仅是整个 JSON 文件。

我使用了缓冲阅读器,但它读取了整个 JSON 文件。

在此先感谢,我是初学者,所以要简单明了地解释事情:)

4

3 回答 3

2

您可以解析整个流,然后提取您需要的内容。下面是一个解析它的例子:

    String url=getUrl();
    JSONObject jsonObject = new JSONObject();
    StringBuilder stringBuilder=new StringBuilder();
    try 
    {
        HttpGet httpGet = new HttpGet(url);
        HttpClient client = new DefaultHttpClient();
        HttpResponse response = client.execute(httpGet);
        HttpEntity entity = response.getEntity();
        InputStream stream = entity.getContent();
        int b;
        while ((b = stream.read()) != -1) {
            stringBuilder.append((char) b);
        }

        jsonObject = new JSONObject(stringBuilder.toString());

    } catch (JSONException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
    } catch (IOException e) {    }

阅读它,您必须在表格中导航,如下所示:

jsonObject.getJSONObject("Results");

这是我使用此库的一个程序的示例:

int statusCode=jobj.getJSONObject("info").getInt("statuscode");

我大量使用以下内容以使其正确:

jsonObject.names();

这将为您提供所有键的名称。从那里,您必须确定它是数组、对象还是原始类型。我需要一点时间才能把它做好,但是一旦你完成了一次,它就永远完成了,希望如此。看看他们的 JSON 库上的 Android 文档。

于 2013-11-13T23:39:25.060 回答
1

GSON 可以将 JSON 树解析为 Java 对象,即 Java 类的实例。因此,如果您想在这种情况下使用 GSON,您必须创建类并使用 JSON 结构的相关字段名称对其进行注释。GSON 有一个非常广泛且易于阅读的文档,请查看。但是对于这种复杂的树,我不建议将它映射到 Java 对象中。如果您只需要一些数据,请删除 GSON 并按照 PearsonArtPhoto 的建议手动导航树。

于 2013-11-13T23:41:15.227 回答
0

您可以使用JsonParser. 这是一个基于您的 url 的示例,您可以立即复制、粘贴和运行。

JsonElement我添加了一个实用方法,允许您使用类似路径的东西从生成的树中获取元素。实际上,您的 JSON 几乎是一棵对象和值的树(预测部分除外)。

请注意, aJsonElement可以根据需要再次“转换”为对象、数组或基值。这就是为什么在调用之后getAtPath,我调用getAsString方法。

package stackoverflow.questions.q19966672;

import java.io.*;
import java.net.*;
import java.nio.charset.Charset;

import com.google.gson.*;

public class Q19966672 {

        private static String readAll(Reader rd) throws IOException {

        BufferedReader reader = new BufferedReader(rd);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();
    }

    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;
    }

    public static void main(String[] args) {
        String url = "http://api.wunderground.com/api/54f05b23fd8fd4b0/geolookup/conditions/forecast/q/US/CO/Denver.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("In " + getAtPath(je, "current_observation/display_location/city").getAsString() + " is " + getAtPath(je, "current_observation/weather").getAsString());

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

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

}

这是结果:

In Denver is Mostly Cloudy
于 2013-11-14T00:40:11.410 回答