3

I get a JSON response from external system in the resposne.body()

The JSON looks like this:

"[{\"workOrderNumber\":\"WO-02612\",\"workOrderId\":\"a3F5C000000LHB0UAO\",\"processingStatus\":\"Open\"}]"

I created a class in my org to deserialize the json.

public class ResponseJSON{

public String sampleNumber;
public String SampleID;
public String state;

}

I did get an error when deserializing the json saying it's a Malformed JSOn because '{' is missing, so it wasn't the correct JSON format. So added the '{' and '}' in the beginning and end of JSON when deserializing the JSON.

ResponseJSON respJson =(ResponseJSON)JSON.deserialize('{' + response.getBody() + '}', ResponseJSON.class);

But this gives me an error:

"common.apex.runtime.impl.ExecutionException: Unexpected character ('}' (code 125)): was expecting a colon to separate field name and value at {the above line}

What am I missing here?

2
  • Your JSON is an array of response class, so please try next instead JSON.deserialize(...,List<ResponseJSON>.class);
    – kurunve
    Apr 11, 2017 at 20:09
  • @kurunve making it as a List I now get an error - "common.apex.runtime.impl.ExecutionException: Malformed JSON: Expected '[' at the beginning of List/Set. Any idea?
    – SfdcBat
    Apr 11, 2017 at 20:42

1 Answer 1

6

Once you add the curly brackets, your JSON looks like this

{
  [
    {
     \"sampleNumber\":\"WO-02609\",
     \"SampleID\":\"a3F5C000000CHATTAM\",
     \"state\":\"Open\"
   }
 ]
}

Which is invalid JSON because you have an list inside of an object without a property name. Instead of adding the curly brackets, change your code to deserialize the JSON differently:

List<ResponseJSON> respJson =(List<ResponseJSON>)JSON.deserialize(response.getBody(), List<ResponseJSON>.class);

Since your JSON starts with square brackets, it's read as a list. Ergo, you should deserialize it as one.

Update

Since you mention in the comments that the external system is adding quotes to your code, I suspect you can do this to make the string JSON-friendly before deserializing

String jsonString = (String)JSON.deserialize(response.getBody(), String.class); 

List<ResponseJSON> respJson =(List<ResponseJSON>)JSON.deserialize(jsonString, List<ResponseJSON>.class);
2
  • This is a list, serialized into JSON... creating a string... which has then been serialized to JSON again (hence the backslashed double-quotes.) Apr 11, 2017 at 20:59
  • 1
    I agree @SebastianKessel. +1, the safest thing, if this is what the external system does, would be to deserialize it into a string, and then deserialize that result into a list. Apr 11, 2017 at 21:14

You must log in to answer this question.

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