1

I need to store value of temperature as Temperature from json payload based on station name "station1" but I always ended up with null.

My code :

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 payload:

{
    "list": [
        {
            "station": {
                "identity": {
                    "station_name": "station1"
                }
            },
            "obs": {
                "temp": {
                    "temprature": 13.2
                }
                
            }
        } ]
}
Harry Coder
  • 2,429
  • 2
  • 28
  • 32
meado1992
  • 19
  • 6

2 Answers2

1

Your JSON is nested Objects within an Array so you can try like below to read the temperature value. I updated your JSON with multiple temperature values to be more clear.

Updated JSON:

{
    "list": [
        {
            "station": {
                "identity": {
                    "station_name": "station1"
                }
            },
            "obs": {
                "temp": {
                    "temprature": 13.2
                }
            }
        },
        {
            "station": {
                "identity": {
                    "station_name": "station2"
                }
            },
            "obs": {
                "temp": {
                    "temprature": 15.2
                }
            }
        }
    ]
}

Code#1: You can use JsonPath to read the data. JsonPath is an alternative to using XPath for easily getting values from a Object document.

    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);
        }
    }

Output:

Temparature: 15.2

Maven dependency for JsonPath

    <dependency>
        <groupId>com.jayway.jsonpath</groupId>
        <artifactId>json-path</artifactId>
        <version>0.9.0</version>
    </dependency>

Below code snippets can be used to read data without any libraries.

Code#2: To read all temperature values.

        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"));
        }

Output:

Temparature0: 13.2
Temparature1: 15.2

Code#3: Get temperature value based on station name.

        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"));
            }
        }

Output:

Temparature: 15.2
Nandan A
  • 2,702
  • 1
  • 12
  • 23
0

My guess is that your issue probably comes from this

try (Reader reader = new FileReader("src/test/resources/jsonPayload/response.json"))

Since you are trying to read a file that's in your classpath you need to specify where to find the file differently.

Try doing

try (Reader reader = new FileReader("jsonPayload/response.json"))

instead

Christiaan
  • 639
  • 1
  • 8
  • 18
  • No . reading from file is correct . My requirement is i need to store temperature variable based on station name So assuming that I have mutliple temperature values and I need to store temperature value for station_name="station1" – meado1992 Oct 29 '21 at 06:43