How can I use json.deserialize apex effectively?

5.4K    Asked by Ankesh Kumar in Salesforce , Asked on Sep 23, 2022

How can I deserialize this json object:


    {
    "response": {
        "count": 1,
        "benchmark": 0.22567009925842,
        "requests": [
            {
                "request": {
                    "id": 537481,
                    "image_thumbnail": "",
                    "title": "Request for new bin(s) - residential",
                    "description": "Propmain ref  3234-1114",
                    "status": "submitted",
                    "address": "36 Pine Tree Close",
                    "location": "Peterborough, England",
                    "zipcode": "PE1 1EJ",
                    "user": "",
                    "date_created": 1417173208,
                    "count_comments": 0,
                    "count_followers": 0,
                    "count_supporters": 0,
                    "lat": 52.599967,
                    "lon": -0.233482,
                    "user_follows": 0,
                    "user_comments": 0,
                    "user_request": 1,
                    "rank": "0"
                }
            }
        ],
        "status": {
            "type": "success",
            "message": "Success",
            "code": 200,
            "code_message": "Ok"
        }
    }
}
What i've tried:
 Map rawObj = (Map) JSON.deserializeUntyped(jsonString);
    Map responseObj = (Map)rawObj.get('response');
    List<Object> reqs = (List<Object>) responseObj.get('requests');
    System.debug('Map Size = ' + reqs.size());
    Map i = new Map ();
    for (Object x : reqs) {
         i = (Map)x;
}
    Map requests = (Map)i.get('request');
    System.debug('Map Size = ' + i.size());
    for (String field : i.keySet()){
        Object id = i.get(field);
        Object title = i.get('title');
        System.debug('Id : ' + id);
        System.debug('title : ' + title);
        //System.debug('Title : ' + title);
      }


Answered by ananya Pawar

I suggest you paste your JSON into http://json2apex.herokuapp.com/ and try the generated code. This tool generates simple Apex classes with a field per JSON field and then you can parse with a single JSON.deserialize.apex call.


Here is the code produced from your JSON. (You can rename the classes as you see fit and also change data types if you know better e.g. use Decimal instead of Double if you are dealing with money.)

//
// Generated by JSON2Apex http://json2apex.herokuapp.com/
//
public class JSON2Apex {
    public class Status {
        public String type;
        public String message;
        public Integer code;
        public String code_message;
    }
    public class Requests {
        public Request request;
    }
    public Response response;
    public class Response {
        public Integer count;
        public Double benchmark;
        public List requests;
        public Status status;
    }
    public class Request {
        public Integer id;
        public String image_thumbnail;
        public String title;
        public String description;
        public String status;
        public String address;
        public String location;
        public String zipcode;
        public String user;
        public Integer date_created;
        public Integer count_comments;
        public Integer count_followers;
        public Integer count_supporters;
        public Double lat;
        public Double lon;
        public Integer user_follows;
        public Integer user_comments;
        public Integer user_request;
        public String rank;
    }
    public static JSON2Apex parse(String json) {
        return (JSON2Apex) System.JSON.deserialize(json, JSON2Apex.class);
    }
    static testMethod void testParse() {
        String json = '{'+
        '"response": {'+
        ' "count": 1,'+
        ' "benchmark": 0.22567009925842,'+
        ' "requests": ['+
        ' {'+
        ' "request": {'+
        ' "id": 537481,'+
        ' "image_thumbnail": "",'+
        ' "title": "Request for new bin(s) - residential",'+
        ' "description": "Propmain ref 3234-1114",'+
        ' "status": "submitted",'+
        ' "address": "36 Pine Tree Close",'+
        ' "location": "Peterborough, England",'+
        ' "zipcode": "PE1 1EJ",'+
        ' "user": "",'+
        ' "date_created": 1417173208,'+
        ' "count_comments": 0,'+
        ' "count_followers": 0,'+
        ' "count_supporters": 0,'+
        ' "lat": 52.599967,'+
        ' "lon": -0.233482,'+
        ' "user_follows": 0,'+
        ' "user_comments": 0,'+
        ' "user_request": 1,'+
        ' "rank": "0"'+
        ' }'+
        ' }'+
        ' ],'+
        ' "status": {'+
        ' "type": "success",'+
        ' "message": "Success",'+
        ' "code": 200,'+
        ' "code_message": "Ok"'+
        ' }'+
        '}'+
        '}';
        JSON2Apex obj = parse(json);
        System.assert(obj != null);
    }
}


Your Answer

Answers (2)

Deserialising seems like it's going to be complicated but it can be very easy. The first step is to try to generate Apex classes for deserialisation from the JSON (this isn't always possible but usually is). I used your JSON to do this:


Once the classes are generated, deserialisation JSON to Apex is usually just a single line of code.

3 Months

Using JSON.deserialize in Apex effectively involves understanding its capabilities and applying best practices for parsing JSON data. Here's a guide on how to use it effectively:


Understand the JSON Structure: Before using JSON.deserialize, make sure you understand the structure of the JSON data you're working with. This includes knowing the keys, values, and hierarchy of the JSON objects.

Define Apex Classes: To deserialize JSON into Apex objects, define corresponding Apex classes that represent the structure of the JSON data. Each class should have variables that map to the keys in the JSON objects.

Use Inner Classes for Nested Objects: If your JSON data contains nested objects, define inner classes within your main Apex class to represent these nested structures. This allows you to maintain a clear and organized structure.

Annotate Classes with @AuraEnabled (for Lightning): If you're deserializing JSON data in a Lightning component, annotate your Apex classes with @AuraEnabled to make them accessible in client-side JavaScript.

Select Appropriate Deserialization Method: Choose the appropriate JSON.deserialize method based on your requirements:

deserializeUntyped: Use this method if you're not sure about the structure of the JSON data or if it varies dynamically.

deserialize: Use this method if you know the structure of the JSON data and want to deserialize it into specific Apex classes.

Handle Errors: Implement error handling to deal with potential issues during deserialization, such as invalid JSON syntax or unexpected data types. Use try-catch blocks to catch exceptions and handle them gracefully.

Consider Performance: When deserializing large JSON payloads, consider the performance implications. Deserialization can be resource-intensive, especially for complex data structures. Optimize your code and avoid unnecessary processing.

Test Thoroughly: Test your deserialization logic with various types of JSON data, including edge cases and invalid inputs. Use unit tests to ensure that your code behaves as expected and handles different scenarios correctly.

Handle Null Values: Account for null values in the JSON data by checking for null before accessing properties or assigning values to variables. This helps prevent NullPointerExceptions.

Use System.Debug for Debugging: Use System.debug statements to debug your deserialization code and inspect the deserialized objects. This can help you identify any issues and troubleshoot them effectively.

By following these guidelines, you can use JSON.deserialize effectively in Apex to parse JSON data and work with it in your Salesforce applications.


6 Months

Interviews

Parent Categories