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