![]() |
#1 |
Участник
|
Распарсить JSON
Добрый день, есть ли у кого нибудь опыт по разбору формата JSON? Может быть кто-нибудь парсил или есть какой драйвер? Axapta 3.0
|
|
![]() |
#2 |
Участник
|
Подход к реализации зависит от структуры JSON файла. Если структура файла предопределена, то можно использовать для 12-ки такой пример:
X++: private void fillTmpTable(str _filePath) { Newtonsoft.Json.Linq.JObject jObject; int recCount, j; TableId tableIdLocal; RecId recIdLocal; DatabaseLogType logTypeLocal; FieldName fieldName; Object varObj, varTitle; Newtonsoft.Json.Linq.JToken jFileToken, jRecordToken, jValuesToken; System.Collections.IEnumerator IEnumerator; Newtonsoft.Json.JsonReader jsonReader; DictField dictField; #define.values("values") ; jObject = Newtonsoft.Json.Linq.JObject::Parse(System.IO.File::ReadAllText(_filePath)); recCount = jObject.get_Count(); for (j = 1; j <= recCount; j++) { jFileToken = (j == 1) ? jObject.get_First() : jFileToken.get_Next(); IEnumerator = jFileToken.GetEnumerator(); while(IEnumerator.MoveNext()) { importTable.initValue(); jRecordToken = IEnumerator.get_Current(); tableIdLocal = jRecordToken.get_Item(identifierStr(TableId)); recIdLocal = jRecordToken.get_Item(identifierStr(RecId)); logTypeLocal = jRecordToken.get_Item(identifierStr(LogType)); importTable.RefTableId = tableIdLocal; importTable.RefRecId = recIdLocal; importTable.LogType = logTypeLocal; if (importTable.validateWrite()) { importTable.insert(); } else { throw error("@SYS62664"); } if (logTypeLocal == DatabaseLogType::Insert || logTypeLocal == DatabaseLogType::Update) { jValuesToken = jRecordToken.get_Item(#values); for (jValuesToken = jValuesToken.get_First(); jValuesToken; jValuesToken = jValuesToken.get_Next()) { importLine.initValue(); importLine.RefRecId = importTable.RecId; jsonReader = jValuesToken.CreateReader(); jsonReader.Read(); varTitle = jsonReader.get_Value(); fieldName = varTitle.ToString(); importLine.RefFieldId = fieldName2id(importTable.RefTableId, fieldName); dictField = new DictField(importTable.RefTableId, importLine.RefFieldId); importLine.RefFieldType = dictField.baseType(); jsonReader.Read(); varObj = jsonReader.get_Value(); importLine.Value = varObj.ToString(); if (importLine.validateWrite()) { importLine.insert(); } else { throw error("@SYS62664"); } } } } } } Альтернативный вариант - парсить строку, где {} границы элемента массива. Последний раз редактировалось mazzy; 21.08.2017 в 11:26. Причина: форматирование |
|
![]() |
#3 |
Участник
|
В Аксапте видел несколько реализаций парсинга, в том числе в стандартном приложении DAX2012. При этом не обязательно использовать именно Ньютон.
Но все из того, что видел, использует NET библиотеки. А у автора Ax3.0. Либо искать подходящий COM (не знаю есть ли они вообще), либо вручную обрабатывать структуру запроса/ответа как текст. |
|
![]() |
#4 |
Участник
|
Писал в аксапте 3.0 небольшой набор классов как раз для разбора-генерации JSON, чтобы не тащить внешние dll. Для моих целей было достаточно. Может быть вам тоже подойдет. При реализации ориентировался на грамматику, описанную вот здесь: http://www.json.org/json-ru.html
В проекте есть тестовый джоб с примером парсинга. Если что-то будет непонятно - спрашивайте.
__________________
С уважением, Rumpleteazer. Последний раз редактировалось rumpleteazer; 14.08.2017 в 11:17. |
|
|
За это сообщение автора поблагодарили: Logger (3), Ace of Database (3), mazzy (2). |
![]() |
#5 |
Участник
|
PS библиотеку из кода изложенного мной выше можно взять с сайта:
https://www.newtonsoft.com/json или из NuGet. Последний раз редактировалось Товарищ ♂uatr; 21.08.2017 в 11:50. |
|
![]() |
#6 |
Участник
|
Если немножко помучиться, то из AX 3.0 тоже можно вызывать .NET dll - Пример
|
|
|
За это сообщение автора поблагодарили: mazzy (2), Logger (3). |
![]() |
#7 |
Участник
|
![]()
Всем спасибо, нашел джобик который парсит json, но он не учитывал вложенные объекты, я его допилил, перенёс в метод, сейчас вроде как работает. newtonsoft буду пробовать прикрутить ))
|
|
|
|