|
|
#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. Причина: форматирование |
|
|
|
|
|