[SalesForce] JSON Deserialize to Visualforce

I am trying to parse json and have it display in a visualforce page.

json:

{  
    "type": "success",
    "value": {
        "id": 151,
        "joke": "Chuck Norris doesn't step on toes. Chuck Norris steps on necks.",
        "categories": []
    }
}

controller:

public class chuckNorris {

    public List<ValueWrapper> value {get;set;}

    public class ValueWrapper {
        public String joke;
        public Integer id;
    }

    public void deserialize () {
        Http h = new Http();
        HttpRequest req = new HttpRequest();
        req.setEndpoint('http://api.icndb.com/jokes/random');
        req.setMethod('GET');
        req.setHeader('Content-type', 'application/json');

        HttpResponse res = h.send(req); 
        String jsonString = res.getBody();

        chuckNorris chuck = (chuckNorris)JSON.deserialize(jsonString, chuckNorris.class);
        system.debug(chuck.value[0].joke);
        system.debug(chuck.value[0].id); 
    }
}

I believe I am using the wrapper class correctly. If I am, how would I display the joke on a visualforce page? If the wrapper class isn't correct what needs to be changed?

Best Answer

The right apex based on the JSON is as below

public class chuckNorris{

public chuckNorris chuck {get;set;}

 public String type_x {get;set;}    //success
 public cls_value value{get;set;}

  public class cls_value {
    public Integer id {get;set;}    //151
    public String joke {get;set;}   //Chuck Norris doesn't step on toes. Chuck Norris steps on necks.
    //public cls_categories[] categories {get;set;}
  }

  public class cls_categories {

  }

  public void deserialize () {
   Http h = new Http();
   HttpRequest req = new HttpRequest();
   req.setEndpoint('http://api.icndb.com/jokes/random');
   req.setMethod('GET');
   req.setHeader('Content-type', 'application/json');
   HttpResponse res = h.send(req); 
   String jsonString = res.getBody();
   String jsonString = jsonString.replaceAll('type','type_x');//Since type is reserved keyword
  chuck = new chuckNorris();
 chuck = (chuckNorris)JSON.deserialize(jsonString, chuckNorris.class);

  }

 }

Visualforce page

Use merge field like below

{!chuck.value.joke}

Vf code is below:

<apex:page Controller="chuckNorris"  sidebar="false" action="{!deserialize}">
   <apex:form>
      <apex:pageBlock>
         <apex:outputText value="{!chuck.value.joke}"> 
         </apex:outputText>
      </apex:pageBlock>
   </apex:form>
 </apex:page>
Related Topic