Получение JSON значений из. json - PullRequest
0 голосов
/ 05 мая 2020

Я сейчас пишу программу, которая извлекает информацию о погоде из api openweathermaps. Он возвращает строку 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, поэтому может быть что-то очевидное, что мне не хватает. Есть идеи, как мне это сделать?

Ответы [ 3 ]

1 голос
/ 05 мая 2020

вы можете использовать

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());
1 голос
/ 05 мая 2020

Вы можете использовать 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
0 голосов
/ 05 мая 2020

Из образца 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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...