Deserialization of Json Array in D365 Finance and operations
Wajahat Wasti
Software Engineer | Microsoft Dynamics AX 2012 | D365 F&O | Power Automate | Power Apps | D365 Integrations
Deserialization is the reverse process of serialization. It involves converting a JSON-formatted string back into a usable data structure within D365 FO. This is crucial when you receive data from external sources in JSON format and need to process it within your ERP system.
In this article we are going to discuss Deserialization of JSON Array in D365 Finance and operation .In our case JSON Array contains nested objects further and then its values .
Here is Tabular form of our JSON
Example Json:
{
"data": [
{
"orderNumber": "PO-001",
"vendor": "ABC Supplier",
"items": [
{
"itemCode": "A001",
"itemName": "Widget",
"quantity": 10
},
{
"itemCode": "A002",
"itemName": "Gadget",
"quantity": 5
}
]
},
{
"orderNumber": "PO-002",
"vendor": "XYZ Supplies",
"items": [
{
"itemCode": "B001",
"itemName": "Tool Set",
"quantity": 2
},
{
"itemCode": "B002",
"itemName": "Paint",
"quantity": 20
}
]
},
{
"orderNumber": "PO-003",
"vendor": "123 Inc.",
"items": [
{
"itemCode": "C001",
"itemName": "Office Chair",
"quantity": 4
},
{
"itemCode": "C002",
"itemName": "Desk Lamp",
"quantity": 8
}
]
},
{
"orderNumber": "PO-004",
"vendor": "Best Electronics",
"items": [
{
"itemCode": "D001",
"itemName": "Laptop",
"quantity": 3
},
{
"itemCode": "D002",
"itemName": "Mouse",
"quantity": 10
}
]
},
{
"orderNumber": "PO-005",
"vendor": "Furniture World",
"items": [
{
"itemCode": "E001",
"itemName": "Sofa",
"quantity": 1
},
{
"itemCode": "E002",
"itemName": "Coffee Table",
"quantity": 2
}
]
}
]
}
Note: For storing Json in variable we can convert json Array into Json string using this Link
Lets Code in Visual studio
We need three classes
- DataClassDataContract
- ?ItemsDataContract
- DeSerialization
(1) DataClassDataContract
This Contract class represents the root node of the JSON data structure, which contains an array of items, with the 'Item' attribute being of type 'List'.
领英推è
[DataContractAttribute('data')]
class DataClassDataContract
{
str orderNumber;
str vendor;
private List itemsDataContractArr;
[DataMemberAttribute("orderNumber")]
public str parmOrderNumber(str _orderNumber = orderNumber)
{
orderNumber = _orderNumber;
return orderNumber;
}
[DataMemberAttribute("vendor")]
public str parmVendor(str _vendor = vendor)
{
vendor = _vendor;
return vendor;
}
[DataMember("items"),
DataCollection(Types::Class, classStr(ItemsDataContract))
]
public List paramItems(List _itemsDataContractArr = itemsDataContractArr)
{
itemsDataContractArr = _itemsDataContractArr;
return itemsDataContractArr;
}
}
(2) ItemsDataContract
This Contract class for the List of Items
[DataContractAttribute]
class ItemsDataContract
{
str itemCode;
str itemName;
str quantity;
[DataMember("itemCode")]
public str paramItemCode(str _itemCode = itemCode)
{
itemCode = _itemCode;
return itemCode;
}
[DataMember("itemName")]
public str paramItemName(str _itemName = itemName)
{
itemName = _itemName;
return itemName;
}
[DataMember("quantity")]
public str paramItemQty(str _quantity = quantity)
{
quantity = _quantity;
return quantity;
}
}
(3) DeSerialization
This class is our main class where Json string is stored in variable and converting into contract objects using FormJsonSerializer::deserializeCollection() method.
Note:
For Json Array [....]: FormJsonSerializer::deserializeCollection( )
For Json Object {....}: FormJsonSerializer::deserializeObject( )
class DeSerilization
{
public static void main(Args _args)
{
List dataMainList = new List(Types::Class);
List itemMainList = new List(Types::Class);
DataClassDataContract dataClassContract = new DataClassDataContract();
ItemsDataContract itemsDataContract = new ItemsDataContract();
ListEnumerator leSub, leItems;
str jsonString = "{\"data\":[{\"orderNumber\":\"PO-001\",\"vendor\":\"ABCSupplier\",\"items\":[{\"itemCode\":\"A001\",\"itemName\":\"Widget\",\"quantity\":10},{\"itemCode\":\"A002\",\"itemName\":\"Gadget\",\"quantity\":5}]},{\"orderNumber\":\"PO-002\",\"vendor\":\"XYZSupplies\",\"items\":[{\"itemCode\":\"B001\",\"itemName\":\"ToolSet\",\"quantity\":2},{\"itemCode\":\"B002\",\"itemName\":\"Paint\",\"quantity\":20}]},{\"orderNumber\":\"PO-003\",\"vendor\":\"123Inc.\",\"items\":[{\"itemCode\":\"C001\",\"itemName\":\"OfficeChair\",\"quantity\":4},{\"itemCode\":\"C002\",\"itemName\":\"DeskLamp\",\"quantity\":8}]},{\"orderNumber\":\"PO-004\",\"vendor\":\"BestElectronics\",\"items\":[{\"itemCode\":\"D001\",\"itemName\":\"Laptop\",\"quantity\":3},{\"itemCode\":\"D002\",\"itemName\":\"Mouse\",\"quantity\":10}]},{\"orderNumber\":\"PO-005\",\"vendor\":\"FurnitureWorld\",\"items\":[{\"itemCode\":\"E001\",\"itemName\":\"Sofa\",\"quantity\":1},{\"itemCode\":\"E002\",\"itemName\":\"CoffeeTable\",\"quantity\":2}]}]}";
dataMainList = FormJsonSerializer::deserializeCollection(classnum(List), jsonString, Types::Class, identifierStr('DataClassDataContract'));
ListEnumerator le = dataMainList.getEnumerator();
while (le.moveNext())
{
dataClassContract = le.current();
Info(strFmt("PONumber:%1 - Vendor:%2 ",dataClassContract.parmOrderNumber(),dataClassContract.parmVendor()));
itemMainList = dataClassContract.paramItems();
leItems = itemMainList.getEnumerator();
while (leItems.moveNext())
{
itemsDataContract = leItems.current();
Info(strFmt("ItemCode:%1 - ItemName:%2 - ItemQuantity:%3",itemsDataContract.paramItemCode(),itemsDataContract.paramItemName(),itemsDataContract.paramItemQty()));
}
}
}
}
Thank you.
Let's connect and grow together.