2015-07-03 217 views
1

我试图从Wunderground.com中检索的JSON file中检索特定的字段。从Java中的JSON文件中检索特定的字段

我试图在此发布相关信息,但无法正确格式化。我正试图在“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文件中检索特定的字段?感谢您提供给我的任何指导,请让我知道是否应该提供任何其他信息。

回答

3

A 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做肮脏的工作。

+0

在这种情况下,您实际上需要检索另一个'JsonObject',因为'latitude'在'current_observation'>'display_location'>'latitude'中。或'current_observation'>'observation_location'>'latitude',因为在那个JSON文件中实际上有两个'latitude',我不知道他想要哪一个。 – ArianJM

+0

@ArianJM:是的,结构无论如何都不相关,我想让他理解这背后的基本原理。它通过'getAsJsonObject'和'getAsJsonArray'遍历树。但有一个自定义类型的适配器仍然是最好的解决方案恕我直言 – Jack

+0

非常感谢你!使用你的例子,我创建了另一个像@ArianJM这样的JsonObject,对于display_location,我得到了我所需要的经纬度。这是一个很好的描述,并且帮助我理解了Json应该如何工作。 – FunBuckets

2

现在作为您的current_observation JSON本身包含一些JSON以及String档案。我会告诉你,1根费尔德station_idJSONimage。你可以使用这样的: -

  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还有其他属性做。希望这有助于。