您可以使用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