Показать сообщение отдельно
Старый 11.08.2017, 16:46   #2  
Товарищ ♂uatr is offline
Товарищ ♂uatr
Участник
Аватар для Товарищ ♂uatr
MCBMSS
 
265 / 808 (27) +++++++
Регистрация: 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. Причина: форматирование