如何根据给定的站点获取温度值?
How to get value of temperature based on station given?
我需要根据站点名称“station1”将来自 json
有效负载的温度值存储为 Temperature,但我总是以 null
结尾。
我的代码:
JSONParser parser = new JSONParser()
try (Reader reader = new FileReader("src/test/resources/jsonPayload/response.json")) {
JSONObject jsonObject = (JSONObject) parser.parse(reader);
String response = (String) jsonObject.get("response");
JsonPath js = new JsonPath(response);
int size = js.getInt(“list.size()");
List<String> station = new ArrayList<>();
for (int i = 0; i < size; i++) {
station.add(js.getString("list[$i].station.station_name))
def Temperature
Temperature = new JsonSlurper().parseText(response).list.station.station_name=["station1”].obs.temp.temprature
}
json 负载:
{
"list": [
{
"station": {
"identity": {
"station_name": "station1"
}
},
"obs": {
"temp": {
"temprature": 13.2
}
}
} ]
}
我猜你的问题可能来自于此
try (Reader reader = new FileReader("src/test/resources/jsonPayload/response.json"))
由于您正在尝试读取 classpath
中的文件,因此您需要指定以不同方式查找文件的位置。
试试
try (Reader reader = new FileReader("jsonPayload/response.json"))
改为
您的 JSON
嵌套 Objects
在 Array
中,因此您可以像下面那样尝试读取温度值。我用多个温度值更新了你的 JSON
以便更清楚。
已更新JSON:
{
"list": [
{
"station": {
"identity": {
"station_name": "station1"
}
},
"obs": {
"temp": {
"temprature": 13.2
}
}
},
{
"station": {
"identity": {
"station_name": "station2"
}
},
"obs": {
"temp": {
"temprature": 15.2
}
}
}
]
}
代码#1: 您可以使用JsonPath
读取数据。 JsonPath
是使用 XPath 的替代方法,可以轻松地从对象文档中获取值。
File jsonFile = new File("Sample.json");
JSONArray jsonArray = new JSONArray(JsonPath.parse(jsonFile).read("list").toString());
for (int i = 0; i < jsonArray.length(); i++) {
String stationName = JsonPath.parse(jsonFile).read("list[" + i + "].station.identity.station_name")
.toString();
if (stationName.equalsIgnoreCase("station2")) {
String temparature = JsonPath.parse(jsonFile).read("list[" + i + "].obs.temp.temprature").toString();
System.out.println("Temparature: "+temparature);
}
}
输出:
Temparature: 15.2
JsonPath
的 Maven 依赖
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>0.9.0</version>
</dependency>
以下代码片段可用于在没有任何库的情况下读取数据。
代码#2:读取所有温度值。
String jsonDataAsString = new String(Files.readAllBytes(Paths.get("Sample.json")));
JSONObject jsonObject = new JSONObject(jsonDataAsString);
JSONArray jsonArray = new JSONArray(jsonObject.get("list").toString());
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = new JSONObject(jsonArray.get(i).toString());
jsonObject = new JSONObject(jsonObject.get("obs").toString());
jsonObject = new JSONObject(jsonObject.get("temp").toString());
System.out.println("Temparature" + i + ": " + jsonObject.get("temprature"));
}
输出:
Temparature0: 13.2
Temparature1: 15.2
代码#3: 根据站点名称获取温度值。
String jsonDataAsString = new String(Files.readAllBytes(Paths.get("Sample.json")));
JSONObject jsonTemparatureObject;
JSONObject jsonObject = new JSONObject(jsonDataAsString);
JSONArray jsonArray = new JSONArray(jsonObject.get("list").toString());
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = new JSONObject(jsonArray.get(i).toString());
jsonTemparatureObject = new JSONObject(jsonObject.get("obs").toString());
jsonObject = new JSONObject(jsonObject.get("station").toString());
jsonObject = new JSONObject(jsonObject.get("identity").toString());
if (jsonObject.get("station_name").toString().equalsIgnoreCase("station2")) {
jsonObject = new JSONObject(jsonTemparatureObject.get("temp").toString());
System.out.println("Temparature: " + jsonObject.get("temprature"));
}
}
输出:
Temparature: 15.2
我需要根据站点名称“station1”将来自 json
有效负载的温度值存储为 Temperature,但我总是以 null
结尾。
我的代码:
JSONParser parser = new JSONParser()
try (Reader reader = new FileReader("src/test/resources/jsonPayload/response.json")) {
JSONObject jsonObject = (JSONObject) parser.parse(reader);
String response = (String) jsonObject.get("response");
JsonPath js = new JsonPath(response);
int size = js.getInt(“list.size()");
List<String> station = new ArrayList<>();
for (int i = 0; i < size; i++) {
station.add(js.getString("list[$i].station.station_name))
def Temperature
Temperature = new JsonSlurper().parseText(response).list.station.station_name=["station1”].obs.temp.temprature
}
json 负载:
{
"list": [
{
"station": {
"identity": {
"station_name": "station1"
}
},
"obs": {
"temp": {
"temprature": 13.2
}
}
} ]
}
我猜你的问题可能来自于此
try (Reader reader = new FileReader("src/test/resources/jsonPayload/response.json"))
由于您正在尝试读取 classpath
中的文件,因此您需要指定以不同方式查找文件的位置。
试试
try (Reader reader = new FileReader("jsonPayload/response.json"))
改为
您的 JSON
嵌套 Objects
在 Array
中,因此您可以像下面那样尝试读取温度值。我用多个温度值更新了你的 JSON
以便更清楚。
已更新JSON:
{
"list": [
{
"station": {
"identity": {
"station_name": "station1"
}
},
"obs": {
"temp": {
"temprature": 13.2
}
}
},
{
"station": {
"identity": {
"station_name": "station2"
}
},
"obs": {
"temp": {
"temprature": 15.2
}
}
}
]
}
代码#1: 您可以使用JsonPath
读取数据。 JsonPath
是使用 XPath 的替代方法,可以轻松地从对象文档中获取值。
File jsonFile = new File("Sample.json");
JSONArray jsonArray = new JSONArray(JsonPath.parse(jsonFile).read("list").toString());
for (int i = 0; i < jsonArray.length(); i++) {
String stationName = JsonPath.parse(jsonFile).read("list[" + i + "].station.identity.station_name")
.toString();
if (stationName.equalsIgnoreCase("station2")) {
String temparature = JsonPath.parse(jsonFile).read("list[" + i + "].obs.temp.temprature").toString();
System.out.println("Temparature: "+temparature);
}
}
输出:
Temparature: 15.2
JsonPath
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>0.9.0</version>
</dependency>
以下代码片段可用于在没有任何库的情况下读取数据。
代码#2:读取所有温度值。
String jsonDataAsString = new String(Files.readAllBytes(Paths.get("Sample.json")));
JSONObject jsonObject = new JSONObject(jsonDataAsString);
JSONArray jsonArray = new JSONArray(jsonObject.get("list").toString());
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = new JSONObject(jsonArray.get(i).toString());
jsonObject = new JSONObject(jsonObject.get("obs").toString());
jsonObject = new JSONObject(jsonObject.get("temp").toString());
System.out.println("Temparature" + i + ": " + jsonObject.get("temprature"));
}
输出:
Temparature0: 13.2
Temparature1: 15.2
代码#3: 根据站点名称获取温度值。
String jsonDataAsString = new String(Files.readAllBytes(Paths.get("Sample.json")));
JSONObject jsonTemparatureObject;
JSONObject jsonObject = new JSONObject(jsonDataAsString);
JSONArray jsonArray = new JSONArray(jsonObject.get("list").toString());
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = new JSONObject(jsonArray.get(i).toString());
jsonTemparatureObject = new JSONObject(jsonObject.get("obs").toString());
jsonObject = new JSONObject(jsonObject.get("station").toString());
jsonObject = new JSONObject(jsonObject.get("identity").toString());
if (jsonObject.get("station_name").toString().equalsIgnoreCase("station2")) {
jsonObject = new JSONObject(jsonTemparatureObject.get("temp").toString());
System.out.println("Temparature: " + jsonObject.get("temprature"));
}
}
输出:
Temparature: 15.2