Вот готовый проект сериализации\десериализации JSON\XML, на базе Newtonsoft.Json. Попробуйте, сравните. Как раз реализуется концепция "за счёт создания структуры классов, соответствующих структуре получаемого JSON, и прямая десериализация". Но скорость обработки от этого не зависит.
Ремарки:
- В части JSON это в бОльшей степени даунгрейд класса FormJsonSerializer из D365
- В части XML написано с нуля
- Всё это реализовано в разгар событий августа 2020 в Беларуси, под шум взрывающихся гранат и стрельбы, поэтому есть огрехи и частности в коде. Вылизывать уже не было сил.
- Принцип использования как в AX2012\D365\.Net: создаём класс-контракт (можно вложенные), проставляем аттрибуты на методах, которые необходимо сериализоывать. Уровень вложенности значения не имеет.
- Вместо аттрибутов, которые AX2009 нативно не поддерживает, используются специального вида макрос,
тут картинка
Вот так вызываем (в проекте есть джоб)
X++:
static void AXSerializerTutorial_JSON_XML(Args _args)
{
VendTable vendTable;
DCVendor dcVendor;
DCVendors dcVendors;
Counter idx;
str json, xml;
;
dcVendors = DCVendors::construct();
while select vendTable
order by RecId desc
{
dcVendor = DCVendor::constructVendTable(vendTable);
dcVendors.parmVendors().addEnd(dcVendor);
idx ++;
if (idx == 3)
{
break;
}
}
dcVendors.parmVendors(dcVendors.parmVendors()); // powinno być tak ;)
json = dcVendors.serialize(HTTPRequestContentType::Json);
xml = dcVendors.serialize(HTTPRequestContentType::XML);
info(json);
info(xml);
dcVendors = dcVendors.deserialize(json, HTTPRequestContentType::Json);
// dcVendors = dcVendors.deserialize(xml, HTTPRequestContentType::XML); // something went wrong... to be debugged
}
Получаем JSON
Получаем XML
Да, прицел был больше на JSON, поэтому XMLная часть не особо отлаживалась - Я уже вижу на картинке не совсем верные наименования узлов + получил взлёт при десиарелизации. Наврное мелочь, но это не точно
В общем попробуйте - расскажите по скорости и в целом, как оно.
SharedProject_AXSerializer_JSON_XML.zip