Friday, October 17, 2014

JSON Parsing with Apex in Salesforce - Part II

This post is in continuation of my previous post regarding JSON Parsing.

In this post, what I am going to share is-

  • How to parse a little more complex JSON containing array. 
  • Once the JSON data is parsed, how to display the same information in Visual Force Page.
Check the below link to understand what I am trying to achieve at the end of this post

So let's start with creating the Visual Force Page
<apex:page controller="StudentDetailController">
    <apex:form >
        <apex:pageBlock Title="JSON Parser Example">
            <apex:commandButton value="Parse JSON Data" action="{!parseJSONData}"
                reRender="studentData" />
        </apex:pageBlock>
        <br />
        <apex:pageBlock id="studentData">
            First Name: <apex:inputText value="{!firstName}" />
            Last Name: <apex:inputText value="{!lastName}" />
            <br/>
             
            <apex:pageBlockSection title="Language Known:" collapsible="false">
                <apex:selectList value="{!selectedLanguage}" multiselect="false"
                    size="1">
                    <apex:selectOptions value="{!languageOptions}"/>
                </apex:selectList>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>
Now the controller-
public class StudentDetailController{  
    public String firstName{get;set;}
    public String lastName{get;set;}
    public String selectedLanguage{get;set;}
    private StudentDetailWrapper m;
    public List<SelectOption> languageOptions;
    
    public void parseJSONData(){
        m = new ParseStudentData().parseData();
        doAllInitialization();
    }
    
    public void parseJSONData(String jsonMessage){
        m = new ParseStudentData().parseData(jsonMessage);
        doAllInitialization();
    }
    
    public List<SelectOption> getLanguageOptions(){
        if(null == languageOptions){
            languageOptions = new List<SelectOption>();
        }
        return languageOptions;
    }
    
    private void doAllInitialization(){
        initializeStudentName();
        initializeLanguageOptions(m.language);
    }
    
    private void initializeStudentName(){
        this.firstName = m.firstName;
        this.lastName = m.lastName;
    }
    
    private void initializeLanguageOptions(List<String> language){
        languageOptions = new List<SelectOption>();
        for(String aLanguage : language){
            languageOptions.add(new SelectOption(aLanguage, aLanguage));
        }
    }
}
Now the class which will do the JSON Parsing-
public class ParseStudentData {
    private StudentDetailWrapper m;
    
    public StudentDetailWrapper parseData(String jsonMessage){
        return doParsing(jsonMessage);
    }
    
    public StudentDetailWrapper parseData(){
        String jsonMessage = '{"firstName" : "Sudipta", "lastName" : "Deb","language": ["Hindi", "German", "English", "Bengali"]}';
        return doParsing(jsonMessage);
    }
    
    private StudentDetailWrapper doParsing(String jsonMessage){
        CustomLogging.logMessage('StudentDetailController', 'parseJSONData', 'Starting of parseJSONData()', CustomLogging.INFO);
        try{
            m = (StudentDetailWrapper) System.JSON.deserialize(jsonMessage, StudentDetailWrapper.class);
        }catch(Exception ex){
            String message = 'Error: ' + ex.getMessage() + '; Stack Trace:' + ex.getStackTraceString();
            CustomLogging.logMessage('ParseStudentData', 'parseJSONData', message, CustomLogging.ERROR);
        }
        return m;
    }
}
Now StudentDetailWrapper Class which will hold the student data-
public class StudentDetailWrapper {
    
    public String firstName;
    public List<String> language;
    public String lastName;
}
And finally the test class - very important:
@isTest
private class TestStudentDetailController {
    
    private static void setEnableCustomLoggingFlag(Boolean value){
        insert(new Decision_Object__c(Name='EnableCustomLogging', Value__c=value));
    }
    
    static testMethod void testJsonParseData() {
        setEnableCustomLoggingFlag(false);
        String jsonMessage = '{"firstName" : "Paromita", "lastName" : "Banerjee","language": ["German", "English", "Bengali"]}';
    
        StudentDetailController studentDetailController = new StudentDetailController();
        studentDetailController.parseJSONData(jsonMessage);
        
        System.assertEquals('Paromita',studentDetailController.firstName);
        System.assertEquals('Banerjee',studentDetailController.lastName);
        System.assertEquals(3,studentDetailController.getLanguageOptions().size());
    }
}

Note: If you are thinking what is the reason for this method setEnableCustomLoggingFlag(),please refer to my earlier post regarding Custom Logging in Salesforce. Link: Custom Logging in Salesforce

Now when we will open the Visual Force Page, it will look like-
But once you click the "Parse JSON Data" it is going to parse the JSON Data in background and populate the same in Visual Force Page like below-

That's all. I am currently working on more complex examples. Will share very soon.
Any feedback is always welcome. Thanks

0 comments:

Post a Comment