function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Arnas BaronasArnas Baronas 

Nested JSON parse using APEX

{
    "data": {
        "xmlns": {
            "cpcdef": "ABCD",
        },
        "search": {
            "total-result-count": "1",
            "ops:query": {
                "syntax": "CQL",
                "$": "123456"
            },
            "range": {
                "begin": "1",
                "end": "1"
            },
            "documents": [
                "produced-by": "RO",
             }]
     }
}
Hello, Everybody !
I am new to development and I need help. Maybe someone could give me apex code example and explain me how to access
Data ---> Search ---> documents ---> produced-by = "RO"

 
Best Answer chosen by Arnas Baronas
Deepali KulshresthaDeepali Kulshrestha
Hi Arnas,
Greetings to you!

- Please use the below code [Solved].
public class JSON2Apex {

    public class Search_Z {
        public String total-result-count {get;set;}
        public Ops:query ops:query {get;set;}
        public Range range {get;set;}
        public Documents documents {get;set;}

        public Search_Z(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'total-result-count') {
                            total-result-count = parser.getText();
                        } else if (text == 'ops:query') {
                            ops:query = new Ops:query(parser);
                        } else if (text == 'range') {
                            range = new Range(parser);
                        } else if (text == 'documents') {
                            documents = new Documents(parser);
                        } else {
                            System.debug(LoggingLevel.WARN, 'Search_Z consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public Data data {get;set;}

    public JSON2Apex(JSONParser parser) {
        while (parser.nextToken() != System.JSONToken.END_OBJECT) {
            if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                String text = parser.getText();
                if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                    if (text == 'data') {
                        data = new Data(parser);
                    } else {
                        System.debug(LoggingLevel.WARN, 'JSON2Apex consuming unrecognized property: '+text);
                        consumeObject(parser);
                    }
                }
            }
        }
    }

    public class Ops:query {
    public String syntax {get;set;}
    public String $ {get;set;}

    public Ops:query(JSONParser parser) {
        while (parser.nextToken() != System.JSONToken.END_OBJECT) {
            if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                String text = parser.getText();
                if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                    if (text == 'syntax') {
                        syntax = parser.getText();
                    } else if (text == '$') {
                        $ = parser.getText();
                    } else {
                        System.debug(LoggingLevel.WARN, 'Ops:query consuming unrecognized property: '+text);
                        consumeObject(parser);
                    }
                }
            }
        }
    }
}

    public class Xmlns {
        public String cpcdef {get;set;}

        public Xmlns(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'cpcdef') {
                            cpcdef = parser.getText();
                        } else {
                            System.debug(LoggingLevel.WARN, 'Xmlns consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public class Documents {
        public String produced-by {get;set;}

        public Documents(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'produced-by') {
                            produced-by = parser.getText();
                        } else {
                            System.debug(LoggingLevel.WARN, 'Documents consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public class Data {
        public Xmlns xmlns {get;set;}
        public Search_Z search_Z {get;set;} // in json: search

        public Data(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'xmlns') {
                            xmlns = new Xmlns(parser);
                        } else if (text == 'search') {
                            search_Z = new Search_Z(parser);
                        } else {
                            System.debug(LoggingLevel.WARN, 'Data consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public class Range {
        public String begin_Z {get;set;} // in json: begin
        public String end_Z {get;set;} // in json: end

        public Range(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'begin') {
                            begin_Z = parser.getText();
                        } else if (text == 'end') {
                            end_Z = parser.getText();
                        } else {
                            System.debug(LoggingLevel.WARN, 'Range consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }


    public static JSON2Apex parse(String json) {
        System.JSONParser parser = System.JSON.createParser(json);
        return new JSON2Apex(parser);
    }

    public static void consumeObject(System.JSONParser parser) {
        Integer depth = 0;
        do {
            System.JSONToken curr = parser.getCurrentToken();
            if (curr == System.JSONToken.START_OBJECT ||
                            curr == System.JSONToken.START_ARRAY) {
                depth++;
            } else if (curr == System.JSONToken.END_OBJECT ||
                            curr == System.JSONToken.END_ARRAY) {
                depth--;
            }
        } while (depth > 0 && parser.nextToken() != null);
    }

}
    
I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.

Thanks and Regards,
Deepali Kulshrestha
www.kdeepali.com

All Answers

mohd anasmohd anas

Hi Arnas,

I found the bit for a glitch in your JSON format, but if it is something like this 

{
    "data": {
        "xmlns": {
            "cpcdef": "ABCD"
        },
        "search": {
            "total-result-count": "1",
            "ops:query": {
                  "syntax": "CQL",
                  "$": "123456"
                },
            "range": {
                  "begin": "1",
                  "end": "1"
                },
            "documents": [{
                    "produced-by": "RO"
                 }]
         }
    }
  }
 

there are two ways to do that

First Method: get the complete JSON in string form in apex variable and call the getProducedBy method some what like this

public class TestJson {
    //Taken the complete JSON as string
	public string jsonStr = '{"data":{"xmlns":{"cpcdef":"ABCD"},"search":{"total-result-count":"1","ops:query":{"syntax":"CQL","$":"123456"},"range":{"begin":"1","end":"1"},"documents":[{"produced-by":"RO"}]}}}';
    
    public string getProducedBy(){
        string producedBy = '';
        
        Map<string,Object> dataMap = (Map<string,Object>) JSON.deserializeUntyped(jsonStr);
        // traversing the data key
        if(dataMap.containsKey('data')){
            Map<string,Object> elementMap = (Map<string,Object>) dataMap.get('data');
            
            // traversing the search key
            if(elementMap.containsKey('search')){
                Map<string,Object> searchKeyMap = (Map<string,Object>) elementMap.get('search');
                

                // traversing the documents key
                if(searchKeyMap.containsKey('documents')){
                    List<Object> documentList = (List<Object>) searchKeyMap.get('documents');
                    
                    //traversing the documents list
                    for(Object obj : documentList){
                        
                        Map<string,Object> docInnerMap = (Map<string,Object>) obj;
                        
                        //check for the key 'produced-by'
                        if(docInnerMap.containsKey('produced-by')){
                            producedBy = (string) docInnerMap.get('produced-by');
                        	break;
                        }
                        else
                            continue;
                       	
                    }
                }
            }
        }
        
        return  producedBy;
    }
}
 

It will return the name of the produced by.

Second Method: If your JSON keys and structure is not subject to change then you can create a wrapper class and deserialize your JSON directly into it, but since the class names in apex  cant contains colon and variable names cant contain hyphen, you would have to replace those characters first, with some other characters in initial JSON sring before deserializing. and the on getting the result you would have to replace them back (In case some value in the result got changed initially will get back to normal)

NOTE: but this way its prone to errors as the characters you choosed might get replaced it they exist already in the string. 


I hope it helps.

Ajay K DubediAjay K Dubedi
Hi Arnas ,

Use bellow wrapper it may helpful for you
public class Wrapper{
    public Data data;
    public Search search;
}
public class Data{
    public Xmlns xmlns;
}
public class Xmlns{
    public String cpcdef;
}
public class Search{
    public String total-result-count;
    public Ops:query ops:query;
    public Range range;
    public Documents documents;
}
public class Ops:query{
    public String syntax;
    public String $;
}
public class Range{
    public String begin;
    public String end;
}
public class Documents{
    public String produced-by;
}
I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.

Thanks and Regards,
Ajay Dubedi
www.ajaydubedi.com
Deepali KulshresthaDeepali Kulshrestha
Hi Arnas,
Greetings to you!

- Please use the below code [Solved].
public class JSON2Apex {

    public class Search_Z {
        public String total-result-count {get;set;}
        public Ops:query ops:query {get;set;}
        public Range range {get;set;}
        public Documents documents {get;set;}

        public Search_Z(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'total-result-count') {
                            total-result-count = parser.getText();
                        } else if (text == 'ops:query') {
                            ops:query = new Ops:query(parser);
                        } else if (text == 'range') {
                            range = new Range(parser);
                        } else if (text == 'documents') {
                            documents = new Documents(parser);
                        } else {
                            System.debug(LoggingLevel.WARN, 'Search_Z consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public Data data {get;set;}

    public JSON2Apex(JSONParser parser) {
        while (parser.nextToken() != System.JSONToken.END_OBJECT) {
            if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                String text = parser.getText();
                if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                    if (text == 'data') {
                        data = new Data(parser);
                    } else {
                        System.debug(LoggingLevel.WARN, 'JSON2Apex consuming unrecognized property: '+text);
                        consumeObject(parser);
                    }
                }
            }
        }
    }

    public class Ops:query {
    public String syntax {get;set;}
    public String $ {get;set;}

    public Ops:query(JSONParser parser) {
        while (parser.nextToken() != System.JSONToken.END_OBJECT) {
            if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                String text = parser.getText();
                if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                    if (text == 'syntax') {
                        syntax = parser.getText();
                    } else if (text == '$') {
                        $ = parser.getText();
                    } else {
                        System.debug(LoggingLevel.WARN, 'Ops:query consuming unrecognized property: '+text);
                        consumeObject(parser);
                    }
                }
            }
        }
    }
}

    public class Xmlns {
        public String cpcdef {get;set;}

        public Xmlns(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'cpcdef') {
                            cpcdef = parser.getText();
                        } else {
                            System.debug(LoggingLevel.WARN, 'Xmlns consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public class Documents {
        public String produced-by {get;set;}

        public Documents(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'produced-by') {
                            produced-by = parser.getText();
                        } else {
                            System.debug(LoggingLevel.WARN, 'Documents consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public class Data {
        public Xmlns xmlns {get;set;}
        public Search_Z search_Z {get;set;} // in json: search

        public Data(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'xmlns') {
                            xmlns = new Xmlns(parser);
                        } else if (text == 'search') {
                            search_Z = new Search_Z(parser);
                        } else {
                            System.debug(LoggingLevel.WARN, 'Data consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }

    public class Range {
        public String begin_Z {get;set;} // in json: begin
        public String end_Z {get;set;} // in json: end

        public Range(JSONParser parser) {
            while (parser.nextToken() != System.JSONToken.END_OBJECT) {
                if (parser.getCurrentToken() == System.JSONToken.FIELD_NAME) {
                    String text = parser.getText();
                    if (parser.nextToken() != System.JSONToken.VALUE_NULL) {
                        if (text == 'begin') {
                            begin_Z = parser.getText();
                        } else if (text == 'end') {
                            end_Z = parser.getText();
                        } else {
                            System.debug(LoggingLevel.WARN, 'Range consuming unrecognized property: '+text);
                            consumeObject(parser);
                        }
                    }
                }
            }
        }
    }


    public static JSON2Apex parse(String json) {
        System.JSONParser parser = System.JSON.createParser(json);
        return new JSON2Apex(parser);
    }

    public static void consumeObject(System.JSONParser parser) {
        Integer depth = 0;
        do {
            System.JSONToken curr = parser.getCurrentToken();
            if (curr == System.JSONToken.START_OBJECT ||
                            curr == System.JSONToken.START_ARRAY) {
                depth++;
            } else if (curr == System.JSONToken.END_OBJECT ||
                            curr == System.JSONToken.END_ARRAY) {
                depth--;
            }
        } while (depth > 0 && parser.nextToken() != null);
    }

}
    
I hope you find the above solution helpful. If it does, please mark as Best Answer to help others too.

Thanks and Regards,
Deepali Kulshrestha
www.kdeepali.com
This was selected as the best answer