0

I use an API from api.nasa.gov that I query using the following Java class to read magnitude information on the latest solar flare of the day.

The response is used to fill in a field on a weather station that informs about current solar hazards.

The problem is that this code only returns the "classType" (magnitude) of first "flrID" (solar flare) event of the day. On July 3, for example, there was more than one event, and the most relevant event is the latest.

I am trying to find out how to get the "classType" of the last "flrID" in the JSON string, given that the flrID text contains an unknown arbitrary time of day.

Secondly, I am not sure how to get event driven updates from NASA, other than from pushed email messages. I am allowed an API request every 3.6 seconds, so that will work, but I am inquiring if there is a less expensive method to get near real time updates from NASA.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.json.JSONException;
import org.json.JSONObject;

public class NasaFlrApiReader {

    public static final String API_KEY = "DEMO_KEY";

    private static String readAll(Reader rd) throws IOException {
        StringBuilder sb = new StringBuilder();
        int cp;
        while ((cp = rd.read()) != -1) {
            sb.append((char) cp);
        }
        return sb.toString();
    }

    public static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
        try (InputStream is = new URL(url).openStream()) {
            BufferedReader rd = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
            String jsonText = readAll(rd);
            int i = jsonText.indexOf("{");
            jsonText = jsonText.substring(i);
            JSONObject json = new JSONObject(jsonText);            
            return json;
        }
    }

    public static void main(String[] args) throws IOException, JSONException {
        JSONObject json = readJsonFromUrl("https://api.nasa.gov/DONKI/FLR?startDate=2021-07-27-03&endDate=2021-07-03&api_key=" + API_KEY);
        System.out.println("Class Type: " + json.get("classType"));
    }
}

This is the JSON text that is returned from the above code:

[
  {
    "flrID": "2021-07-03T02:14:00-FLR-001",
    "instruments": [
      {
        "displayName": "GOES-P: EXIS 1.0-8.0"
      }
    ],
    "beginTime": "2021-07-03T02:14Z",
    "peakTime": "2021-07-03T02:31Z",
    "endTime": "2021-07-03T02:39Z",
    "classType": "C5.7",
    "sourceLocation": "N23W75",
    "activeRegionNum": 12838,
    "linkedEvents": [
      {
        "activityID": "2021-07-03T03:48:00-CME-001"
      }
    ],
    "link": "https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/FLR/17197/-1"
  },
  {
    "flrID": "2021-07-03T07:04:00-FLR-001",
    "instruments": [
      {
        "displayName": "GOES-P: EXIS 1.0-8.0"
      }
    ],
    "beginTime": "2021-07-03T07:04Z",
    "peakTime": "2021-07-03T07:17Z",
    "endTime": "2021-07-03T07:22Z",
    "classType": "M2.7",
    "sourceLocation": "N23W78",
    "activeRegionNum": 12838,
    "linkedEvents": [
      {
        "activityID": "2021-07-03T08:00:00-CME-001"
      }
    ],
    "link": "https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/FLR/17189/-1"
  },
  {
    "flrID": "2021-07-03T14:18:00-FLR-001",
    "instruments": [
      {
        "displayName": "GOES-P: EXIS 1.0-8.0"
      }
    ],
    "beginTime": "2021-07-03T14:18Z",
    "peakTime": "2021-07-03T14:29Z",
    "endTime": "2021-07-03T14:34Z",
    "classType": "X1.5",
    "sourceLocation": "N23W80",
    "activeRegionNum": 12838,
    "linkedEvents": [
      {
        "activityID": "2021-07-03T14:48:00-CME-001"
      }
    ],
    "link": "https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/FLR/17201/-1"
  },
  {
    "flrID": "2021-07-03T16:59:00-FLR-001",
    "instruments": [
      {
        "displayName": "GOES-P: EXIS 1.0-8.0"
      }
    ],
    "beginTime": "2021-07-03T16:59Z",
    "peakTime": "2021-07-03T17:03Z",
    "endTime": "2021-07-03T17:14Z",
    "classType": "M1.0",
    "sourceLocation": "N23W82",
    "activeRegionNum": 12838,
    "linkedEvents": [
      {
        "activityID": "2021-07-03T17:36:00-CME-001"
      }
    ],
    "link": "https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/FLR/17208/-1"
  }
]
John
  • 31
  • 3

1 Answers1

2

The JSON contains an array so during deseralisation, you need to use JSONArray and then get the last element of the array using length-1,

 JSONArray jsonArr = new JSONArray(jsonText);
 JSONObject lastObject = (JSONObject) jsonArr.get(jsonArr.length()-1);

If length-1 does not give you the last record then you need to sort the JSONArray based on the required field and then take the first or last based on sorting. You can check the below thread for sorting the JSONArray How can I sort a JSONArray in JAVA

pratap
  • 538
  • 1
  • 5
  • 11