Handling JSON strings with arbitrary structures can be very difficult with a lot of serializing and deserializing. This library is attempts to make it easier to traverse a JSON object to retrieve whatever data you need.
Given the following JSON string, to access the FirstName
property of the third item in the ContactList
property, you would have to do the following:
{
"Account":{
"ID" : "00100000000000000Y",
"Name" : "Test Name",
"ParentAccount":{
"ID" : "00100000000000000X",
"Name" : "Test Parent Name"
},
"ItemList" : [],
"ContactList" : [ {
"ID" : "00300000000000000Y",
"FirstName" : "Joey",
"LastName" : "Jojo"
}, {
"ID" : "00300000000000000Z",
"FirstName" : "Xandar",
"LastName" : "Ahmed"
}, {
"ID" : "00300000000000000X",
"FirstName" : "Melissa",
"LastName" : "Bond"
}, {
"ID" : "00300000000000000W",
"FirstName" : "Gina",
"LastName" : "Pavlova"
}]
}
}
Map<String, Object> jsonMap = (Map<String, Object>) JSON.deserializeUntyped(TEST_JSON);
Map<String, Object> accountMap = (Map<String, Object>) JSON.deserializeUntyped(JSON.serialize(jsonMap.get('Account')));
List<Object> contactList = (List<Object>) JSON.deserializeUntyped(JSON.serialize(accountMap.get('ContactList')));
Map<String, Object> aContact = (Map<String, Object>) JSON.deserializeUntyped(JSON.serialize(contactList[2]));
System.assertEquals('Melissa', (String)aContact.get('FirstName'));
With JSON Node, you can do the following instead:
System.assertEquals(
'Melissa',
(String) new JSONNode(TEST_JSON)
.getNode('Account')
.getNodeList('ContactList')[2]
.getNodeValue('FirstName')
)