2

I need some help deserializing a json string that I have pass from an action funciton.

This is my javascript

function something(){
    //SOME CODE
    var actDetails = { Client__c: clidLong, RecordType: rtId, Type: type, Client_Manager__c: clidLong };
    //SOME MORE CODE
    vfPageAF(JSON.stringify(actDetails));
}

on my VF Page:

<apex:actionFunction name="newActivityApex" action="{!newActivity}" reRender="resultPanel" status="myStatus">
    <apex:param name="firstParam" assignTo="{!actInfo}" value="true" />
</apex:actionFunction>

on my controller I am trying to do something like this:

public Map<String,String> actInfo{get;set;} 

public void newActivity(){
    Map<String, SObject> actInfo = JSON.deserializeUntyped(actInfoTXT);
    system.debug(actInfo);
}    

I keep getting exception errors

2 Answers 2

0

Here is an example describing Serializing and Deserializing a Account Object in Salesforce

  • This example allows a user to select a Account and retrieve data using JSON.
  • The parseJson function executes a SOQL query to retrieve a Account object.
  • Using the JSON.serialize method the Account object is serialized to a JSON formatted string.
  • It is then passed to the Visualforce page.
  • Using the JSON.parse Javascript function on the Visualforce page, we are able to easily retrieve values and populate the respective HTML controls.

VF Page

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

    <!-- Bootstrap core CSS -->


    <!-- Bootstrap core CSS -->
    <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>

    <br/>

 </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><br/>

                     <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 -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
    </script>
    <script src="js/bootstrap.min.js"></script>
  </body>
 </html>

 </apex:page>

Controller

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 ; }    
}

Source: - http://www.sandeeparora.org/2014/10/example-serialize-objects-into-json-strings-in-apex/

1
  • Thank you, I couldnt find with your way the way to pass from javascript object to map. So I just post what I did and work for me. It was passing the object as a string and then change it the other way around
    – manza
    Commented Jul 22, 2015 at 10:05
0

I end up doing something like this, were I pass the object as a string:

VF:

    <apex:actionFunction name="newActivityApex" action="{!newActivity}" reRender="resultPanel" status="myStatus">
        <apex:param name="firstParam" assignTo="{!actInfoTXT}" value="" />
    </apex:actionFunction>

The controller side

    public String actInfoTXT{get;set;} 
    public void newActivity(){
        Map<String, Object> actInfo = (Map<String, Object>) JSON.deserializeUntyped(actInfoTXT);
        //to get information from my object
        String recTypeID = String.valueOf(actInfo.get('RecordType'));
        system.debug(actInfo);
    }  

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .