英文:
Getting JSON values from a .json
问题
我目前正在编写一个程序,从openweathermaps api中获取天气信息。它返回一个类似于这样的JSON字符串:
{"coord":{"lon":-95.94,"lat":41.26},"weather":[{"id":500,"main":"Rain","description":"light
rain","icon":"10n"}],"base":"stations","main": ...更多的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方面的经验不多,所以可能有一些明显的东西我漏掉了。你对如何实现这一点有什么想法吗?
英文:
I am currently writing a program that pulls weather info from openweathermaps api. It returns a JSON string such as this:
{"coord":{"lon":-95.94,"lat":41.26},"weather":[{"id":500,"main":"Rain","description":"light
rain","icon":"10n"}],"base":"stations","main": ...more json
I have this method below which writes the string to a .json and allows me to get the values from it.
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;
}
The problem is it only allows me to get the outer values such as "coord"
and "weather"
. So currently since I have System.out.println(Jobj.get("weather"));
it will return [{"icon":"10n","description":"light rain","main":"Rain","id":500}]
but I want to actually get the values that are inside of that like the description
value and the main
value. I haven't worked much with JSONs so there may be something obvious I am missing. Any ideas on how I would do this?
答案1
得分: 1
你可以使用 JsonPath(https://github.com/json-path/JsonPath)来直接提取一些 JSON 字段/值。
var json = "{
\"coord\":{\"lon\":\"-95.94\",\"lat\":\"41.26\"},
\"weather\":[{\"id\":\"500\",\"main\":\"Rain\",\"description\":\"light\"}]
}";
var main = JsonPath.read(json, "$.weather[0].main"); // Rain
英文:
You can use JsonPath (https://github.com/json-path/JsonPath) to extract some json field/values directly.
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
答案2
得分: 1
你可以使用以下代码:
JSONObject Jobj = (JSONObject) obj;
System.out.println(Jobj.getJSONObject("coord").get("lon")); // 这里的 coord 是 JSON 对象
System.out.println(Jobj.getJSONArray("weather").getJSONObject(0).get("description")); // 对于数组
或者你可以根据结构声明用户定义的类,并使用 GSON 进行代码转换:
Gson gson = new Gson();
MyWeatherClass weather = gson.fromJson(Jobj.toString(), MyWeatherClass.class);
System.out.println(weather.getCoord());
英文:
you can use
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
or you can declare user defined class according to structure and convert code using GSON
Gson gson= new Gson();
MyWeatherClass weather= gson.fromJSON(Jobj .toString(),MyWeatherClass.class);
System.out.println(weather.getCoord());
答案3
得分: 0
根据您提供的 JSON 示例,可以看出 "weather" 实际上是一个对象数组,因此在代码中需要将其视为数组,以便在转换为 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;
}
英文:
From the json sample that you have provided it can be seen that the "weather" actually is an array of objects, so you will have to treat it as such in code to get individual objects from the array when converted to Jsonobject.
Try something like :
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;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论