
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.
<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>
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