1

I'm trying to deserialize http json output . Getting an ERROR :System.JSONException: Malformed JSON: Expected '[' at the beginning of List/Set

 public static void syncBC(){
        HttpResponse respond = getrespond();

        if(respond.getStatusCode()==200){

                list<customerLedgerEntry> clist= new customerLedgerEntry().parse(respond.getbody());

        }
    }
    public static HttpResponse getrespond(){
        Http http = new Http();
    HttpRequest request = new HttpRequest();
    request.setEndpoint ('callout:Bc_test/PBCLE');
    request.setHeader('Accept','*/*');
    request.setMethod('GET');
    request.setTimeout(40000);
        HttpResponse response = Http.send(request);
        return response;
    }

    public class customerLedgerEntry{
        public String Entry_No;
        public Date Posting_Date;
        public String Document_Type;
        public String Document_No;
        public String Customer_No;
        public Decimal Amount_LCY;
        public Decimal Amount;
        public Date Initial_Entry_Due_Date;

        public list<customerLedgerEntry> parse(String json){

            return(list<customerLedgerEntry>) System.JSON.deserialize(json, list<customerLedgerEntry>.class);

        }

    }

Here is the JSON output example:

       {"@odata.context":"https://api.businesscentral.dynamics.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "value":[{"@odata.etag":"W/\"xxxxxxxxxxxxxxxxxxxxxxx\"",
            "Entry_No":1,"Posting_Date":"2018-11-05","Entry_Type":"Initial Entry","Document_Type":"xxx",
"Document_No":"xxx","Customer_No":"13",
            "Initial_Entry_Global_Dim_1":"",
        "Initial_Entry_Global_Dim_2":"",
        "Currency_Code":"","Amount":-9,
        "Amount_LCY":-9,"Debit_Amount":0,"Debit_Amount_LCY":0,
            "Credit_Amount":9,
        "Credit_Amount_LCY":9,
        "Initial_Entry_Due_Date":"2018-11-05",
        "User_ID":"xxxx","xxx":"","Reason_Code":"","Unapplied":false,
            "Unapplied_by_Entry_No":0,
    "Cust_Ledger_Entry_No":xxx},

    {"@odata.etag":"W/\"xxxxxxxxxxxxxxxxxxxxxxx\"",
    "Entry_No":2,"Posting_Date":"2018-11-21",
            "Entry_Type":"Initial Entry","Document_Type":"xxx",
    "Document_No":"1234","Customer_No":"5423","Initial_Entry_Global_Dim_1":"",
            "Initial_Entry_Global_Dim_2":"","Currency_Code":"","Amount":-91234.84,"Amount_LCY":-91234.84,"Debit_Amount":0,"Debit_Amount_LCY":0,
            "Credit_Amount":91234.84,"Credit_Amount_LCY":91234.84,"Initial_Entry_Due_Date":"2018-11-21","User_ID":"NANCYR","xxx":"","Reason_Code":"",
            "Unapplied":false,"Unapplied_by_Entry_No":0,"Cust_Ledger_Entry_No":xxx}]}
1
  • Something that I've noticed - looking at the JSON it seems like it is malformed. The value for Cust_Ledger_Entry_No is xxx instead of an actual string like so "xxx". You can try validating the JSON here - jsonlint.com. Commented Jun 9, 2020 at 5:39

1 Answer 1

0

First, you have to deserialized untyped as your JSON is not a list of customerLedgerEntry. Then you can deserialize typed.

I have removed some of the invalid values from your JSON, and its working fine now. For Demo, I have just kept one record. See this is how it works.

Map<String, Object> jsonMap =   (Map<String, Object>) JSON.deserializeUntyped('{ "@odata.context":"https://api.businesscentral.dynamics.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "value":[ { "Posting_Date":"2018-11-21", "Entry_Type":"Initial Entry", "Document_Type":"xxx", "Document_No":"1234", "Customer_No":"5423"} ] }');

list<object> entrylisttemp = (list<object>)jsonMap.get('value');
list<testDeserialize.customerLedgerEntry> entries = (list<testDeserialize.customerLedgerEntry>)System.JSON.deserialize(JSON.serialize(entrylisttemp), list<testDeserialize.customerLedgerEntry>.class);
System.debug(entries);
10
  • Thankyou Rahul. Now I'm getting System.LimitException: Apex heap size too large: 22645046, I think i need to write a batch class for not hitting the heap size. Commented Jun 9, 2020 at 5:48
  • what is the size of entry list ? is it so big? @jagadeeshparasa Commented Jun 9, 2020 at 6:02
  • Yes @Rahul the size of entry list is like 23MB Commented Jun 9, 2020 at 6:07
  • @jagadeeshparasa then you need to fetch that in smaller chunks, and yes batch will be fine. Just make sure that you request data in smaller chunks Commented Jun 9, 2020 at 6:16
  • can you send me the sample code to fetch the data in smaller chunks @Rahul Commented Jun 9, 2020 at 8:38

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.