function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
María Jesús CarmonaMaría Jesús Carmona 

Deserialize JSON to a list

Hi!
I would like to know how to deserialize a JSON response on a list (to use it later on a for).
Im trying to deserialize the response, but the result of the deserialize is always null.

The response I receive contains a list of ServiceNow incidents, on the following format:
{"result":[{"short_description":"text","sys_id":"004fbc4cdb062300d6e781cc0b961989","contact_type":"email","incident_state":"2","impact":"4","description":"text"},{"short_description":"text","sys_id":"0188096ddb45a340d6e781cc0b961971","contact_type":"email","incident_state":"2","impact":"4","description":"text"},{"short_description":"text","sys_id":"02786099db66df40d6e781cc0b96197a","contact_type":"email","incident_state":"2","impact":"4","description":"text"}]}

At the moment my code looks like this:

ServiceNowBatch
//Authentication + request done (req and res)
// (...)
List<Case> casesToUpdate = new List<Case>;
String response = res.getBody();

//Having problems here
CaseWrapper caseWrapperDes = (CaseWrapper)JSON.deserialize(response, CaseWrapper.class);
System.debug('caseWrapper content: '+caseWrapperDes);

// (...)
for (CaseWrapper SNcase : caseWrapperDes) {
	if (response.length() > 0 && response.substring(0, 5) != 'Error') {
		Case c = new Case();
		c.description = SNcase.description;
		c.origin = SNcase.contact_type;
		
		casesToUpdate.add(c);
	}
}
return casesToUpdate;
(...)

CaseWrapper
CaseWrapper
public class CaseWrapper {

    public List<resultSN> results {get; set;}

    public class resultSN {
        public String short_description {get; set;}
        public String sys_id {get; set;}
        public String contact_type {get; set;}
        public String incident_state {get; set;}
        public String impact {get; set;}
        public String description {get; set;}
    }
}

CaseWrapperList
CaseWrapperList
public class CaseWrapperList {
    public List<CaseWrapper> results;
}

I don't know what I'm missing.
Best Answer chosen by María Jesús Carmona
Egor Gerasimenko 9Egor Gerasimenko 9

For starters, your JSON says the field name is "result" but in your CaseWrapper class it's called "results". 

Also, line 11 

for (CaseWrapper SNcase : caseWrapperDes) {

should probably be 
for (CaseWrapper.resultSN SNcase : caseWrapperDes.results) {

It's also against convention to start class names like "resultSN" with a lowercase letter, although it will still run just fine.

Lastly, I would move the if statement out of the loop. The condition does not depend on your loop variable SNcase, it will be either true for all of them or false for all of them. This just wastes CPU cycles. You should do the check once, and if it's true then enter your code block

if (response.length() > 0 && response.substring(0, 5) != 'Error') {
  CaseWrapper caseWrapperDes = (CaseWrapper)JSON.deserialize(response, CaseWrapper.class);
  System.debug('caseWrapper content: '+caseWrapperDes);

  for (...) {
    //do stuff
  }
}