You could use FormJsonSerializer::deserializeCollection.
public class RecordContract
{
List fieldValues;
[DataMember. DataCollectionAttribute(Types::Class, classStr(FieldValueContract))]
public List Records(List __fieldValues= fieldValues)
{
fieldValues= __fieldValues;
return fieldValues;
}
}
[DataContract]
class FieldValueContract
{
FieldName fieldName;
FieldValue fieldValue;
[DataMember]
public FieldName FieldName(FieldName _fieldName= fieldName)
{
fieldName = _fieldName;
return fieldName;
}
[DataMember]
public FieldValue FieldValue(FieldValue _fieldValue = fieldValue)
{
fieldValue = _fieldValue;
return fieldValue;
}
}
List records = FormJsonSerializer::deserializeCollection(classNum(List), json, Types::Class, classStr(RecordContract));
The list is a list of Records, with the nested list populated with FieldValues.
Test using a test case - forgive the hacky code, naming, and lack of comments...it is just meant to give an idea of how to use it.
class JsonTest extends SysTestCase
{
const str json =
'[{"FieldValues": [{"FieldName": "Field1", "FieldValue"; "Rec1Field1Value"},'+
' {"FieldName": "Field2", "FieldValue": "Rec1Field2Value"}]},'+
'[{"FieldValues": [{"FieldName": "Field1", "FieldValue": "Rec2Field1Value"},'+
' {"FieldName": "Field2", "FieldValue": "Rec2Field2Value"}]}]';
[SysTestMethod]
public void JsonDeserialiseTest()
{
List records = FormJsonSerializer::deserializeCollection(classNum(List), json, Types::Class, classStr(RecordContract));
this.assertNotNull(records, "No records found in Json string");
ListEnumerator recordLe = records.getEnumerator();
RecordContract record;
FieldValueContract fieldValue;
List fieldList;
ListEnumerator fieldLe;
while (recordLe.moveNext())
{
record = recordLe.current();
fieldList = record.FieldValues();
this.assertNotNull(fieldList, 'No fields found in record element of Json string');
fieldLe = FieldList.getEnumerator();
while (fieldLe.moveNext())
{
fieldValue = fieldLe.current();
this.assertNotEqual('', fieldValue.FieldName(), 'Field was empty');
this.assertNotEqual('', fieldValue.FieldName(), 'Field value empty');
}
}
}