AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.08.2017, 16:04   #1  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Распарсить JSON
Добрый день, есть ли у кого нибудь опыт по разбору формата JSON? Может быть кто-нибудь парсил или есть какой драйвер? Axapta 3.0
Старый 11.08.2017, 16:46   #2  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
305 / 873 (30) +++++++
Регистрация: 23.10.2012
Подход к реализации зависит от структуры 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");
                    }
                }
            }
        }
    }
}
По сути, http://www.newtonsoft.com/json/help/...troduction.htm - основной источник информации по взаимодействию.
Альтернативный вариант - парсить строку, где {} границы элемента массива.

Последний раз редактировалось mazzy; 21.08.2017 в 11:26. Причина: форматирование
Старый 12.08.2017, 07:56   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1293 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
В Аксапте видел несколько реализаций парсинга, в том числе в стандартном приложении DAX2012. При этом не обязательно использовать именно Ньютон.
Но все из того, что видел, использует NET библиотеки. А у автора Ax3.0. Либо искать подходящий COM (не знаю есть ли они вообще), либо вручную обрабатывать структуру запроса/ответа как текст.
Старый 14.08.2017, 11:13   #4  
rumpleteazer is offline
rumpleteazer
Участник
 
127 / 28 (1) +++
Регистрация: 02.09.2002
Писал в аксапте 3.0 небольшой набор классов как раз для разбора-генерации JSON, чтобы не тащить внешние dll. Для моих целей было достаточно. Может быть вам тоже подойдет. При реализации ориентировался на грамматику, описанную вот здесь: http://www.json.org/json-ru.html
В проекте есть тестовый джоб с примером парсинга. Если что-то будет непонятно - спрашивайте.
Вложения
Тип файла: zip JSON.zip (9.7 Кб, 246 просмотров)
__________________
С уважением, Rumpleteazer.

Последний раз редактировалось rumpleteazer; 14.08.2017 в 11:17.
За это сообщение автора поблагодарили: Logger (3), Ace of Database (3), mazzy (2).
Старый 21.08.2017, 11:44   #5  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
305 / 873 (30) +++++++
Регистрация: 23.10.2012
PS библиотеку из кода изложенного мной выше можно взять с сайта:
https://www.newtonsoft.com/json или из NuGet.

Последний раз редактировалось Товарищ ♂uatr; 21.08.2017 в 11:50.
Старый 21.08.2017, 15:16   #6  
_scorp_ is offline
_scorp_
Участник
Аватар для _scorp_
MCBMSS
 
488 / 369 (13) ++++++
Регистрация: 25.07.2007
Адрес: Москва
Если немножко помучиться, то из AX 3.0 тоже можно вызывать .NET dll - Пример
За это сообщение автора поблагодарили: mazzy (2), Logger (3).
Старый 21.08.2017, 16:57   #7  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Thumbs up Конец
Всем спасибо, нашел джобик который парсит json, но он не учитывал вложенные объекты, я его допилил, перенёс в метод, сейчас вроде как работает. newtonsoft буду пробовать прикрутить ))
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
goshoom: Open API for JSON-based custom services in AX 7 Blog bot DAX Blogs 0 22.07.2017 14:17
goshoom: Discovery of JSON-based custom services in AX 7 Blog bot DAX Blogs 0 22.07.2017 14:17
goshoom: JSON-based custom service with parameters (AX 7) Blog bot DAX Blogs 0 23.02.2017 14:13
kurthatlevik: AX 7 RTW – My ODATA and JSON journey – Part I Blog bot DAX Blogs 0 08.03.2016 21:16
workflowax: JSON in Dynamics AX – Advanced example #1 (Basic Auth) Blog bot DAX Blogs 0 11.11.2013 11:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:40.