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
George Laird 29George Laird 29 

Please help with JSON

Hello All,

I'm brand new to this and I'm having trouble with generating JSON.  
I am getting an error like "Cannot start array, expecting field name"
Please help!!!!


Here is what I'm trying to emulate:


{
  "RatingZip": "",
  "YearsInBusiness": "",
  "NatureOfBusiness": "",
  "IsNonProfit": "",
  "Product": "", REQUIRED
  "IsIncumbantAgent": "",
  "ClassCodeList": [
    {
      "ClassCode": "", REQUIRED
      "ClassDescriptionCode": "",
      "LocState": "", REQUIRED
      "Payroll": "", REQUIRED
      "FullTimeEmployees": "",
      "PartTimeEmployees": ""
    }
  ],
  "GenerateProposal": "",
  "LegalEntity": "",
  "Fein": "",
  "Applicant": { REQUIRED
    "BusinessName": "", REQUIRED
    "BusinessAddress1": "", REQUIRED
    "BusinessCity": "", REQUIRED
    "BusinessState": "", REQUIRED
    "BusinessZip": "", REQUIRED
    "MailingAddress1": "",
    "MailingCity": "",
    "MailingState": "",
    "MailingZip": "",
    "ContactInformation": { REQUIRED
      "FirstName": "", REQUIRED
      "LastName": "", REQUIRED
      "Email": "", REQUIRED
      "Phone": "" REQUIRED
    }
  },
  "Salutation": "",
  "CompanyWebsiteAddress": "",
  "EffectiveDate": "", REQUIRED
  "ExpiredPremium": ""
}

And here is my code:

JSONGenerator gen = JSON.createGenerator(true);   
        gen.writeStartObject();
        gen.writeStringField('RatingZip', '');
        gen.writeNumberField('YearsInBusiness', 0);
        gen.writeStringField('NatureOfBusiness', '');
        gen.writeBooleanField('IsNonProfit', false);
        gen.writeStringField('Product', 'WC');
        gen.writeBooleanField('IsIncumbantAgent', false);
        gen.writeStringField('ClassCodeList', '');
        gen.writeStartArray();
        gen.writeStringField('ClassCode', i.Class_Code__c);
        gen.writeStringField('ClassDescriptionCode', '');
        gen.writeStringField('LocState', '');
        gen.writeStringField('Payroll', i.Payroll__c);
        gen.writeStringField('FullTimeEmployees', '');
        gen.writeStringField('PartTimeEmployees', '');
        gen.writeEndArray();
        gen.writeBooleanField('GenerateProposal', true);
        gen.writeNumberField('LegalEntity', 0);
        gen.writeStringField('Fein', '');
        gen.writeObjectField('Applicant', '');
        gen.writeStartObject();
        gen.writeStringField('BusinessName', i.Business_Name__c);
        gen.writeStringField('BusinessAddress1', i.Business_Address__c);
        gen.writeStringField('BusinessCity', i.Business_City__c);
        gen.writeStringField('BusinessState', i.Business_State__c);
        gen.writeStringField('BusinessZip', i.Business_Zip__c);
        gen.writeStringField('MailingAddress1', '');
        gen.writeStringField('MailingCity', '');
        gen.writeStringField('MailingState', '');
        gen.writeStringField('MailingZip', '');
        gen.writeStartObject();
        gen.writeObjectField('ContactInformation', '');
        gen.writeStringField('FirstName', i.First_Name__c);
        gen.writeStringField('LastName', i.Last_Name__c);
        gen.writeStringField('Email', i.Email__c);
        gen.writeStringField('Phone', i.Phone__c);
        gen.writeEndObject();
        gen.writeEndObject();
        gen.writeStringField('Salutation', '');
        gen.writeStringField('CompanyWebsiteAddress', '');
        gen.writeStringField('EffectiveDate', i.Effective_Date__c);
        gen.writeNumberField('ExpiredPremium', 0);
        gen.writeEndObject();
        
Best Answer chosen by George Laird 29
Andy Kallio 7Andy Kallio 7
Before gen.writeStartArray() you need to use gen.writeFieldName(). Here is an example that I eventually got to work after encountering that same error.
 
JSONGenerator gen = JSON.createGenerator(true);

		system.debug(invs.Name);

		gen.writeStartObject();
		gen.writeStringField('type', 'invoice');
		gen.writeStringField('isDynamic', 'false');
		gen.writeFieldName('columns');
		gen.writeStartObject();
		gen.writeObjectField('tranid', invs.Name);
		gen.writeObjectField('companyid', invs.Project__r.Netsuite_Id__c);
		gen.writeObjectField('trandate', nsService.formatDate(invs.Expected_Invoice_Date__c));
        gen.writeObjectField('entity', invs.Project__r.Netsuite_Id__c);
		gen.writeEndObject();

		gen.writeFieldName('lines');
		gen.writeStartObject();
		gen.writeStringField('sublistId', 'item');
		gen.writeFieldName('lineItems');
		gen.writeStartArray();
		for(Invoice_Line_Item__c ili : invs.Invoice_Line_Items__r) {
		    gen.writeStartObject();
		    gen.writeObjectField('quantity', ili.Quantity__c);
		    gen.writeObjectField('rate', ili.Sales_Price__c);
		    gen.writeObjectField('account', ili.Product__r.Netsuite_Product_Code__c);
            gen.writeObjectField('item', i);
		    gen.writeEndObject();
            i++;
		}    
		gen.writeEndArray();
		gen.writeEndObject();
		gen.writeEndObject();

 

All Answers

Andy Kallio 7Andy Kallio 7
Before gen.writeStartArray() you need to use gen.writeFieldName(). Here is an example that I eventually got to work after encountering that same error.
 
JSONGenerator gen = JSON.createGenerator(true);

		system.debug(invs.Name);

		gen.writeStartObject();
		gen.writeStringField('type', 'invoice');
		gen.writeStringField('isDynamic', 'false');
		gen.writeFieldName('columns');
		gen.writeStartObject();
		gen.writeObjectField('tranid', invs.Name);
		gen.writeObjectField('companyid', invs.Project__r.Netsuite_Id__c);
		gen.writeObjectField('trandate', nsService.formatDate(invs.Expected_Invoice_Date__c));
        gen.writeObjectField('entity', invs.Project__r.Netsuite_Id__c);
		gen.writeEndObject();

		gen.writeFieldName('lines');
		gen.writeStartObject();
		gen.writeStringField('sublistId', 'item');
		gen.writeFieldName('lineItems');
		gen.writeStartArray();
		for(Invoice_Line_Item__c ili : invs.Invoice_Line_Items__r) {
		    gen.writeStartObject();
		    gen.writeObjectField('quantity', ili.Quantity__c);
		    gen.writeObjectField('rate', ili.Sales_Price__c);
		    gen.writeObjectField('account', ili.Product__r.Netsuite_Product_Code__c);
            gen.writeObjectField('item', i);
		    gen.writeEndObject();
            i++;
		}    
		gen.writeEndArray();
		gen.writeEndObject();
		gen.writeEndObject();

 
This was selected as the best answer
George Laird 29George Laird 29
@Andy Kallio 7   Thanks that did the trick!