0

I need to create a JSON with information about Contacts of an Account, in order to send it to an webservice.

The thing is I can't find a way to create this JSON when a Account has more than a single Contact.

I'm currently testing with this apex method:

 public static string createJSON(String ident){
    String msj = '';

    List<Contact> contactos = [select AccountId, RecordType.id, Phone, MobilePhone, BC_IE_celular2__c, BC_IE_Telefono_2__c, Extension_Usuario__c from Contact where accountId = :ident];

    if(contactos.size() == 0){
        msj = 'Account has 0 Contacts';
    }else if(contactos.size() == 1){
        msj = '[';
            msj += '{';
                msj += '"celular1": "'+contactos[0].MobilePhone+'", ';
                msj += '"celular2": "'+contactos[0].BC_IE_celular2__c+'", ';
                msj += '"telefono1": "'+contactos[0].Phone+'", ';
                msj += '"telefono2": "'+contactos[0].BC_IE_Telefono_2__c+'", ';
                msj += '"UserAnexo": "'+contactos[0].Extension_Usuario__c+'", ';
                msj += '"ClientId": "'+contactos[0].AccountId+'", ';
                msj += '"NroLista": "1" ';
            msj += '}';
        msj += ']';
    }else if (contactos.size() > 1){

        system.debug('this has '+contactos.size()+' contacts');           

    }

    return msj;
}

I know this is not the best way to create a JSON, but is Working on Accounts with 0 or 1 Contact.

This is how must be the JSON with more than 1 Contacts in an Account  This is how must be the JSON with more than 1 Contacts in an Account

There is another way to serialize a JSON with Lists?

Thanks in advance.

5
  • 1
    Have you tried JSON.serialize(contactos)?
    – gNerb
    Jan 8 '20 at 19:17
  • yes, but the result shows "attributes": { "type": "Contact", "url": "/services/data/v48.0/sobjects/Contact/003e000001GIqu1AAD" }, and "RecordType": { "attributes": { "type": "RecordType", "url": "/services/data/v48.0/sobjects/RecordType/012c0000000Dp61AAC" }, "Id": "012c0000000Dp61AAC" }. There is any way to skip those things? Jan 8 '20 at 19:28
  • 1
    Why do you want to skip them? Is it causing errors for you?
    – gNerb
    Jan 8 '20 at 19:38
  • Not causing troubles for me, but my client needs only what is in the image example. Jan 8 '20 at 19:42
  • 1
    You should push back and see if they can just ignore "extra" properties in the JSON. It should be trivial for most implementations.
    – Adrian Larson
    Jan 8 '20 at 19:44
1

If you REALLY need to remove the extra parts of the JSON try the following:

List<Contact> contacts = [SELECT Id FROM Contact LIMIT 5];
String j = JSON.serialize(contacts);
List<Object> untyped = (List<Object>) JSON.deserializeUntyped(j);

for (Object o : untyped) {
    Map<String, Object> contact = (Map<String, Object>) o;

    contact.remove('attributes');
    contact.remove('RecordType');
}

system.debug(json.serialize(untyped));

Here is an answer I wrote a while back on dealing with dynamic json.

I would strongly advise just serializing the list and sending it out. The receiving server should be smart enough to only parse the bits they care about and ignore the rest.

1
  • Probably vastly more efficient to just use getPopulatedFieldsAsMap.
    – Adrian Larson
    Jan 8 '20 at 20:22
0

I've found a good solution in this code:

List<Map<String, Object>> mm = new List<Map<String, Object>>();
for (Lead l : [
        SELECT Email, First_Name__c, Last_Name__c ,lead_ag__C, Agency_Type__c
        FROM Lead
        WHERE Id in :leads
        ]) {
    Map<String, Object> m = new Map<String, Object>{
        'email' => l.Email,
        'first_name' => l.First_Name__c,
        ...
    };
    mm.add(m);
}

It worked like a charm, but instead of inserting the data as in the order of the image example, I had to inver the order, so it worked as:

List<Map<String,Object>> mm = new List<Map<String,Object>>();
for(Contact con : contactos){
    Map<String, Object> m = new Map<String, Object>{
        'NroLista' => '1',
        'ClientId' => con.AccountId,
        'UserAnexo' => con.Extension_Usuario__c,
        'telefono2' => con.BC_IE_Telefono_2__c,
        'telefono1' => con.Phone,
        'celular2' => con.BC_IE_celular2__c,
        'celular1' => con.MobilePhone
    };
    mm.add(m);
}

String jsonString = JSON.serialize(mm);

The result looks like:

[
    {
        "NroLista": 1,
        "ClientId": "001e000001Tf6xuAAB",
        "UserAnexo": "4321",
        "telefono2": "987811666",
        "telefono1": "987811666",
        "celular2": "+51987811666",
        "celular1": "+51987811666"
    },
    {
        "NroLista": 1,
        "ClientId": "001e000001Tf6xuAAB",
        "UserAnexo": "4321",
        "telefono2": "987811666",
        "telefono1": "987811666",
        "celular2": "+51987811666",
        "celular1": "+51987811666"
    },
    {
        "NroLista": 1,
        "ClientId": "001e000001Tf6xuAAB",
        "UserAnexo": "4321",
        "telefono2": "987811666",
        "telefono1": "987811666",
        "celular2": "+51987811666",
        "celular1": "+51987811666"
    }
]

Using an Account with 3 Contacts.

The original solution is here:

JSON structure?

Thanks all.

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.