从Java中的JSON文件中检索特定字段

时间:2015-07-03 20:30:10

标签: java json gson

我正在尝试从Wunderground.com检索的JSON file中检索特定字段。

我试图在此发布相关信息,但无法正确格式化。我试图在“current_observation”部分下检索经度和纬度。我正在使用Gson 2.2.4。这是我目前的代码:

    String key = "aaaaaaaaaaaaaaaa";
    String sURL = "http://api.wunderground.com/api/" + key + "/conditions/forecast/q/19104.json";

    URL url = new URL(sURL);
    URLConnection request = (URLConnection) url.openConnection();
    request.connect();

    JsonParser jp = new JsonParser(); //from gson
    JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
    JsonObject rootobj = root.getAsJsonObject(); 
    JsonElement latitude = rootobj.get("current_observation");

    System.out.println(latitude);

这当前获取“current_observation”标记下的所有内容,并将其打印到屏幕上。我无法弄清楚如何访问其中的任何内容。我在这里看到了几个关于使用JsonArray的帖子,但无论我尝试什么,我都无法让它正常工作。那么如何从JSON文件中检索特定字段?感谢您给我的任何指导,如果我应该提供任何其他信息,请告诉我。

2 个答案:

答案 0 :(得分:3)

JsonElement是一个通用接口,由两个重要的其他类(JsonArrayJsonObject进行子类化。

由于您没有为Gson提供反映信息的类型(并填写相应的对象),因此您必须亲自前往。由于"current_observation"是字典类型,因此它是JsonObject,您可以这样做:

 JsonObject observation = root.getAsJsonObject().get("current_observation").getAsJsonObject();

此时,您可以像以前一样检索特定字段:

float longitude = observation.get("longitude").getAsFloat();

等等。

对于特定字段,您可能需要提供自定义反序列化程序或序列化程序。实际上,最好的解决方案是将您的镜像结构放在代码存储库中,例如:

class Observation
{
  float latitude;
  float longitude;
  // other fields you are interested in
}

这样您就可以提供自己的deserializer并执行:

Observation observation = gson.fromJson(root.getAsJsonObject().get("current_observation"), Observation.class)

让Gson做肮脏的工作。

答案 1 :(得分:2)

现在,您的current_observation JSON本身包含一些JSON以及String个文件。我会告诉你1个字符串feild station_id和其他JSON字段image。你可以这样使用: -

            JsonParser jp = new JsonParser(); //from gson
            JsonElement root = jp.parse(new InputStreamReader((InputStream) request.getContent()));
            JsonObject rootobj = root.getAsJsonObject(); 
            JSONObject curObs = (JSONObject)rootobj.get("current_observation");
            JSONObject image = (JSONObject)curObs.get("image"); // image is a JSON
            String imageUrl= (String)image.get("url"); // get image url
            String stationId = (String)curObs.get("station_id"); // get StationId

同样,您也可以为JSON的其他属性执行此操作。希望这有帮助。