【问题标题】:Getting JSON values from a .json从 .json 获取 JSON 值
【发布时间】:2020-08-19 17:18:12
【问题描述】:

我目前正在编写一个从 openweathermaps api 提取天气信息的程序。它返回一个 JSON 字符串,如下所示:

{"coord":{"lon":-95.94,"lat":41.26},"weather":[{"id":500,"main":"Rain","description":"light 
rain","icon":"10n"}],"base":"stations","main": ...more json

我有下面这个方法,它将字符串写入 .json 并允许我从中获取值。

    public String readJSON() {

    JSONParser parse = new JSONParser();
    String ret = "";

    try {
        FileReader reader = new FileReader("C:\\Users\\mattm\\Desktop\\Java Libs\\JSON.json");
        Object obj = parse.parse(reader);

        JSONObject Jobj = (JSONObject) obj;
        System.out.println(Jobj.get("weather"));

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println(ret);
    return ret;

}

问题是它只允许我获取外部值,例如"coord""weather"。所以目前因为我有System.out.println(Jobj.get("weather"));,它将返回[{"icon":"10n","description":"light rain","main":"Rain","id":500}],但我想实际获取其中的值,例如description 值和main 值。我对 JSON 的工作不多,所以我可能缺少一些明显的东西。关于我将如何做到这一点的任何想法?

【问题讨论】:

  • 您可以使用JsonPathRest Assured,后者使用gson path。两者都是读取 JSON 文件的好工具。您还可以创建代表 JSON 的 POJO 类。很酷的东西
  • @souvikbachhar 回答的将 GSON 与 POJO 结合使用将是更好的选择。

标签: java json api-design


【解决方案1】:

从您提供的 json 示例中可以看出,“天气”实际上是一个对象数组,因此在转换为 Jsonobject 时,您必须在代码中将其视为从数组中获取单个对象。 尝试类似:

public String readJSON() {

JSONParser parse = new JSONParser();
String ret = "";

try {
    FileReader reader = new FileReader("C:\\Users\\mattm\\Desktop\\Java Libs\\JSON.json");
    Object obj = parse.parse(reader);

    JSONObject jobj = (JSONObject) obj;
    JSONArray jobjWeatherArray = jobj.getJSONArray("weather")

    for (int i = 0; i < jobjWeatherArray.length(); i++) {
      JSONObject jobjWeather = jobjWeatherArray.getJSONObject(i);
      System.out.println(jobjWeather.get("id"));
      System.out.println(jobjWeather.get("main"));
      System.out.println(jobjWeather.get("description"));
    }

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} catch (ParseException e) {
    e.printStackTrace();
}
System.out.println(ret);
return ret;

}

【讨论】:

  • entriesJSON 中的 JSONObject jobjWeather = entriesJSON.getJSONObject(i); 是什么我看不到它在哪里实例化
  • @Matt 抱歉重命名了实例但忘记更新该部分,已更新代码。
【解决方案2】:

你可以使用

JSONObject Jobj = (JSONObject) obj;
System.out.println(Jobj.getJSONObject("coord").get("lon");//here coord is json object
System.out.println(Jobj.getJSONArray("weather").get(0).get("description");//for array

或者您可以根据结构声明用户定义的类并使用 GSON 转换代码

Gson gson= new Gson();
MyWeatherClass weather= gson.fromJSON(Jobj .toString(),MyWeatherClass.class);
System.out.println(weather.getCoord());

【讨论】:

  • 在尝试拨打getJSONArray() 时,我似乎不断收到The method getJSONArray(String) is undefined for the type JSONObject。我有 gson 和 simple-jason 依赖项。还有其他需要吗?
  • 使用下面的依赖来读取 JSON 并删除简单的 JSON,你不会得到未定义的错误。 &lt;dependency&gt; &lt;groupId&gt;org.json&lt;/groupId&gt; &lt;artifactId&gt;json&lt;/artifactId&gt; &lt;version&gt;20190722&lt;/version&gt; &lt;/dependency&gt;
【解决方案3】:

您可以使用 JsonPath (https://github.com/json-path/JsonPath) 直接提取一些 json 字段/值。

 var json = "{\"coord\":{\"lon\":\"-95.94\",\"lat\":\"41.26\"},\n" +
                " \"weather\":[{\"id\":\"500\",\"main\":\"Rain\",\"description\":\"light\"}]}";
 var main = JsonPath.read(json, "$.weather[0].main");  // Rain

【讨论】:

  • 效果很好!谢谢!
猜你喜欢
  • 2018-12-19
  • 2016-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2017-10-22
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多