0

I found contact data as JSON on the web that is not organized as the Contact sObject as the phone number is being stored as hierarchical data: please see https://api.androidhive.info/contacts/ for the structure.

contacts:   
0:  
id: "c200"
name:   "Ravi Tamada"
email:  "ravi@gmail.com"
address:    "xx-xx-xxxx,x - street, x - country"
gender: "male"
phone:  
mobile: "+91 0000000000"
home:   "00 000000"
office: "00 000000"

This is the callout for the data:

public static HttpResponse makeCallout() {
    Http http = new Http();
    HttpRequest request = new HttpRequest();
    request.setEndpoint('https://api.androidhive.info/contacts/');
    request.setMethod('GET');
    HttpResponse response = http.send(request);

    // If the request is successful, parse the JSON response.
    if (response.getStatusCode() == 200) {
        // Deserializes the JSON string into collections of primitive data types.
        Map<String, Object> results = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
        // Cast the values in the 'contacts' key as a list
        List<Object> contacts = (List<Object>) results.get('contacts');
        System.debug('Received the following contacts:');
        for (Object contact: contacts) {
            System.debug(contact);
        }
    }
    return response;
}

In the for loop I now can define the object Contact and assign values from the object. For the hierarchical data, would I write the following code:

Contact cont = new Contact();
cont.phone = contact.phone.home; ?

Thank you for your advice!

1

Create a List<Contact> and you can populate the equivalent fields one-by-one with the for loop.

You could see the phone structure and setup the Contact record like this:

List<Contact> sfContacts = new List<Contact>();
for (Object contact: contacts) {
    Contact newCont = new Contact();
    newCont.MobilePhone = contact.get('phone').get('mobile');
    // etc...
    sfContacts.add(newCont);
}

insert sfContacts;
| improve this answer | |
  • Ok, thank you very much, that is the answer I needed! – user40501 Apr 30 '19 at 10:00
  • Hi I get an error "Method does not exist or incorrect signature: void get(String) from the type Object"! – user40501 Apr 30 '19 at 10:10
  • I just read that accessing properties in objects is not possible in Apex. Read salesforce.stackexchange.com/questions/135891/…. So there must be a different solution to the problem of accessing hierarchical data? – user40501 Apr 30 '19 at 11:30
  • Try another JSON.deserializeUntyped() on the contact.get('phone'). The whole structure you linked is all JSON, so you should be able to deserialize all the way down – Brian Miller Apr 30 '19 at 11:34
  • I think you can also just type case it to Map<String, Object>, like: newContact.MobilePhone = ((Map<String, Object>)contact.get('phone')).get('mobile'); – Brian Miller Apr 30 '19 at 12:33

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.