1

I am trying to parse an array using Apex that contains nested json data from an external REST API call. The code is shown below, the response comes back, but I want to get at the keys/fields in the json, but can't get the syntax right. The array has 3 data sets of JSON objects, but it could have more obviously.

HttpResponse response = h.send(request);
            
if (response.getStatusCode() == 200) {

  List<Object> arr =(List<Object>)JSON.deserializeUntyped(response.getBody());
    
  // this does not work, showing what I am trying
  System.debug('Data Field ----------------->' + arr[0].get('InternalID'));

}

Here is the JSON Array that comes back from my API call. I am trying to get the value of the InternalID field

[
 {
  "_id": "2e61ee4dc8501c8dc96f74d8",
  "Data": {
    "xmlns": "http://www.nasa.gov/data",
    "dataVersion": "2016v3.0",
    "DataHeader": {
      "StartDate": "2016-07-01",
      "OrgDetails": {
        "PhoneNum": 5552421111,
        "BusinessNameAlias": "NasaGov",
        "BusinessName": {
          "BusinessNameFull": "Nasa Systems"
        }
      },
      "InternalID": 222825542494
    }
  }
}
]

2 Answers 2

2

These are nested objects. As such, you have to follow each object in the path. For InternalID:

Map<String, Object> dataNode = (Map<String, Object>)arr[0].get('Data');
Map<String, Object> dataHeaderNode = (Map<String, Object>)dataNode.get('DataHeader');
String internalId = (String)dataHeaderNode.get('InternalID');

Each time you encounter a {} pair, you're in a new nested object. Also be aware that if you saw another [] in a node, it'd be a new List<Object> you have to walk through.

1
  • I seem to get an error @sfdcfox with the first line when trying to save the code to my sandbox in my IDE. Error: Method does not exist or incorrect signature: void get(String) from the type Object Sep 2, 2019 at 20:22
0

You can also use custom apex types and let JSON.deserialize do the work for you

class ResponseItem {
  String _id;
  DataItem data;
}

class DataItem {
  String xmlns;
  ...
  DataHeader dataHeader;
}

class DataHeader {
  Date startDate;
  OrgDetails orgDetails;
  Long InternalId;
}

class OrgDetails {
 ...
}

ResponseItem[] responseItems = 
 (ResponseItem[]) JSON.deserialize(response.getBody(),List<ResponseItem>.class);

for (ResponseItem ri: responseItems) {
  Long internalId = ri.data.dataHeader.InternalId;
  .. do something with this
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.