public class JSONRoundTripSample { public class InvoiceStatement { Long invoiceNumber; Datetime statementDate; Decimal totalPrice; public InvoiceStatement(Long i, Datetime dt, Decimal price) { invoiceNumber = i; statementDate = dt; totalPrice = price; } } public static void SerializeRoundtrip() { Datetime dt = Datetime.now(); // Create a few invoices. InvoiceStatement inv1 = new InvoiceStatement(1,Datetime.valueOf(dt),1000); InvoiceStatement inv2 = new InvoiceStatement(2,Datetime.valueOf(dt),500); // Add the invoices to a list. List<InvoiceStatement> invoices = new List<InvoiceStatement>(); invoices.add(inv1); invoices.add(inv2); // Serialize the list of InvoiceStatement objects. String JSONString = JSON.serialize(invoices); System.debug('Serialized list of invoices into JSON format: ' + JSONString); // Deserialize the list of invoices from the JSON string. List<InvoiceStatement> deserializedInvoices = (List<InvoiceStatement>)JSON.deserialize(JSONString, List<InvoiceStatement>.class); System.assertEquals(invoices.size(), deserializedInvoices.size()); Integer i=0; for (InvoiceStatement deserializedInvoice :deserializedInvoices) { system.debug('Deserialized:' + deserializedInvoice.invoiceNumber + ',' + deserializedInvoice.statementDate.formatGmt('MM/dd/yyyy HH:mm:ss.SSS') + ', ' + deserializedInvoice.totalPrice); system.debug('Original:' + invoices[i].invoiceNumber + ',' + invoices[i].statementDate.formatGmt('MM/dd/yyyy HH:mm:ss.SSS') + ', ' + invoices[i].totalPrice); i++; } } }
The behavior of the serialize method differs depending on the Salesforce API version of the Apex code saved.
Contact con = [SELECT Id, LastName, AccountId FROM Contact LIMIT 1]; // Set additional field con.FirstName = 'Joe'; String jsonstring = Json.serialize(con); System.debug(jsonstring); System.assert(jsonstring.contains('Joe') == true);
String jsonString = JSON.serialize( Database.query('SELECT Count(Id),Account.Name FROM Contact WHERE Account.Name != null GROUP BY Account.Name LIMIT 1')); System.debug(jsonString); // Expected output in API v 26 and earlier or v28 and later // [{"attributes":{"type":"AggregateResult"},"expr0":2,"Name":"acct1"}]
String jsonString = JSON.serialize( [SELECT Id, Name, Website FROM Account WHERE Website = null LIMIT 1]); System.debug(jsonString); // In v27.0 and earlier, the string includes the null field and looks like the following. // {"attributes":{...},"Id":"001D000000Jsm0WIAR","Name":"Acme","Website":null} // In v28.0 and later, the string doesn’t include the null field and looks like // the following. // {"attributes":{...},"Name":"Acme","Id":"001D000000Jsm0WIAR"}}