JSON is short for JavaScript Object Notation, and is a way to store information in an organized, easy-to-access manner. In a nutshell, it gives us a human-readable collection of data that we can access in a really logical manner. You can skimm about JSON in this article.
In real time we need to parse JSON data comes from external app or some time date needed to be presented on Vf pages using Java Script for complex data tables and insert into salesforce objects.For that we need to parse JSON data and insert them into database object as records or retrive Objact as JSOM string to Vf page.
Apex has two classes, JSON Class and JSONParser Class which can utilized in these scenarios.
JSON Parser
In real time we need to parse JSON data comes from external app and insert into salesforce objects.For that we need to parse JSON data and insert them into database object as records.For that we need to write the wrapper class with key names in json string we got and then by using json parser class we can do parsing as shown below.
In the following example i have a JSON string with lead data having firstname,lastname,company,city,state etc.
Page and Controller:
<apex:form >
<div style="color:#FFFAF0;background-color:#808000;font-weight:bold;">
JSON String
</div>
<div style="color:#000080;background-color:#EEE8AA;width:100%;height:100px;">
<center>{!jsonstring}</center>
</div>
<apex:pageBlock >
<apex:pageBlockButtons location="top">
<apex:commandButton value="Parse & Insert" action="{!parseJsonString}"/>
</apex:pageBlockButtons>
<apex:pageBlockTable value="{!lstlead}" var="le">
<apex:column headerValue="First Name" value="{!le.FirstName}"/>
<apex:column headerValue="Last Name" value="{!le.LastName}"/>
<apex:column headerValue="Company" value="{!le.Company}"/>
<apex:column headerValue="City" value="{!le.City}"/>
<apex:column headerValue="State" value="{!le.State}"/>
<apex:column headerValue="PostalCode" value="{!le.PostalCode}"/>
<apex:column headerValue="Phone" value="{!le.Phone}"/>
<apex:column headerValue="Lead Status" value="{!le.Status}"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
public class Jsonstringparser {
public String jsonstring{get;set;}
public List<Lead> lstlead{get;set;}
public Jsonstringparser(){
jsonstring='[{"FirstName":"Balaji","LastName":"Malemarpuram","Company":"Oracle","City":"Hyderabad","State":"AP","PostalCode":500081,"Phone":9502026343,"Status":"Open - Not Contacted","Tags":[]},{"FirstName":"Sreevardhan","LastName":"Malemarpuram","Company":"Appshark","City":"Hyderabad","State":"AP","PostalCode":500081,"Phone":95055556343,"Status":"Open - Not Contacted","Tags":[]}]';
lstlead=new List<Lead>();
}
public void parseJsonString(){
JSONParser parser = JSON.createParser(jsonstring);
while (parser.nextToken() != null) {
if (parser.getCurrentToken() == JSONToken.START_ARRAY) {
while (parser.nextToken() != null) {
if (parser.getCurrentToken() == JSONToken.START_OBJECT) {
Jsonparsercls le = (Jsonparsercls)parser.readValueAs(Jsonparsercls.class);
Lead leadobj=new Lead();
leadobj.FirstName=le.FirstName;
leadobj.LastName=le.LastName;
leadobj.Company=le.Company;
leadobj.City=le.City;
leadobj.State=le.State;
leadobj.PostalCode=le.PostalCode;
leadobj.Phone=le.Phone;
leadobj.Status=le.Status;
lstlead.add(leadobj);
}
}
}
}
if(lstlead!=null && lstlead.size()>0)
insert lstlead;
}
public class Jsonparsercls{
public String FirstName{get;set;}
public String LastName{get;set;}
public String Company{get;set;}
public String City{get;set;}
public String State{get;set;}
public String PostalCode{get;set;}
public String Phone{get;set;}
public String Status{get;set;}
}
}
JSON Class
Contains methods for serializing Apex objects into JSON format and deserializing JSON content that was serialized using the serialize method in this class. Use the methods in the System.JSON class to perform round-trip JSON serialization and deserialization of Apex objects.
Ref: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_class_System_Json.htm
Apex Class
public class AccountJSON{
public String JSONtext {get;set;}
public Account VISacct {get;set;}
public String AccountSelected {get;set;}
public AccountJSON() { }
public void parseJson() {
String sAccName = 'Burlington Textiles Corp of America';
if (AccountSelected == null) {
AccountSelected = sAccName ;
}
String soql = 'SELECT Name,AccountNumber,site,AccountSource, AnnualRevenue,
BillingAddress, Fax,Phone, Website, TickerSymbol,
NumberofEmployees, Ownership, SIC FROM Account
WHERE name = :AccountSelected LIMIT 1';
Account acct = Database.Query(soql);
VISacct = acct ;
JSONtext = JSON.serialize(acct);
}
public List<SelectOption> getAccountList() {
List<SelectOption> AllAccountNames = new List<SelectOption>();
string tempaccount;
List<Account> Accounts = [SELECT Name FROM Account];
For (Account ar : Accounts ) {
tempaccount= (string) ar.get('Name');
AllAccountNames.add(new SelectOption(tempaccount,tempaccount));
}
return AllAccountNames ;
}
}
Vf Page
<pre class="wp-block-syntaxhighlighter-code"><apex:page docType="html-5.0" controller="AccountJSON" action="{!parseJson}" showHeader="false" sidebar="false" standardStylesheets="false" >
<script type="text/javascript">
function parseJson() {
var sJSON = document.getElementById("inJSON").value;
var obj = JSON.parse(sJSON );
document.getElementById("idtitle").innerHTML = obj.Name;
document.getElementById("idphone").innerHTML = obj.Phone ;
document.getElementById("idfax").innerHTML = obj.Fax;
document.getElementById("idwebsite").innerHTML = obj.Website;
document.getElementById("accname").innerHTML = obj.Name ;
document.getElementById("accountnumber").innerHTML = obj.AccountNumber;
document.getElementById("annualrevenue").innerHTML = obj.AnnualRevenue;
document.getElementById("ownership").innerHTML = obj.Ownership;
document.getElementById("numberofemployees").innerHTML = obj.NumberOfEmployees;
}
</script>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content=""/>
<meta name="author" content=""/>
<title>Account Details - Retrieve using JSON</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" />
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet" />
</head>
<body >
<apex:form >
<div class="container">
<div class="row">
<div class="col-md-9">
<h4>Select Account</h4>
<apex:selectList value="{!AccountSelected}" size="1" id="cityddlb" styleClass="form-control" >
<apex:selectOptions value="{!AccountList}"/>
<apex:actionSupport event="onchange" reRender="strJSON" action="{!parseJson}"/>
</apex:selectList>
<button type="button" onclick="parseJson()" styleClass="btn btn-primary" >
Get Account Details</button></div>
</div>
</div>
</apex:form>
<div class="container">
<div class="row" >
<div class="col-md-9">
<div class="panel panel-primary">
<div class="panel-body bg-primary">
<h2 class="panel-title" id="idtitle">Account name will be populated
here via JSON</h2>
<div><small class="glyphicon glyphicon-th"></small> JSON below</div>
<apex:outputPanel id="strJSON">
<div> <input type="text" class="form-control" placeholder="Username" id="inJSON" value="{!JSONtext}" /></div>
</apex:outputPanel></div>
</div>
<div class="row">
<div class="col-md-6">
<ul class="list-group">
<li class="list-group-item list-group-item-info"><strong>Account Details
</strong></li>
<li class="list-group-item">Account Name: <span class="label label-primary" id="accname"></span></li>
<li class="list-group-item">Account Number: <span class="label label-primary" id="accountnumber"></span></li>
<li class="list-group-item">Annual Revenue: <span class="label label-success" id="annualrevenue"></span></li>
<li class="list-group-item">Ownership: <span class="label label-success" id="ownership"></span></li>
<li class="list-group-item">Number of Employees: <span class="label label-primary" id="numberofemployees"></span></li>
</ul>
</div>
<div class="col-md-6">
<ul class="list-group">
<li class="list-group-item list-group-item-success"><strong>Important Information
</strong></li>
<li class="list-group-item"><small class="glyphicon glyphicon-phone"></small>
Phone:<span class="badge alert-info" id="idphone"> </span></li>
<li class="list-group-item"><small class="glyphicon glyphicon-home"></small>
Fax: <span class="badge alert-info" id="idfax"></span></li>
<li class="list-group-item"><small class="glyphicon glyphicon-file"></small>
Website: <span class="badge alert-info pull-right" id="idwebsite" ></span></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- /container -->
<div class="container">
<footer>
</footer>
</div>
<!-- /container -->
<!-- Bootstrap core JavaScript ================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<a href="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js</a>
<a href="http://js/bootstrap.min.js">http://js/bootstrap.min.js</a>
</body>
</html>
</apex:page></pre>