JSON (JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.
Несмотря на происхождение от JavaScript (точнее, от подмножества языка стандарта ECMA-262 1999 года), формат считается языконезависимым и может использоваться практически с любым языком программирования.
JSON-текст представляет собой (в закодированном виде) одну из двух структур:
- Набор пар ключ: значение (заключается в фигурные скобки { }). В 1C это реализовано как структура. Ключом может быть только строка, значением — любая форма.
- Упорядоченный набор значений (заключается в квадратные скобки [ ]). В 1C это может быть реализовано как массив.
"firstName": "Иван",
"lastName": "Иванов",
"address": {
"streetAddress": "Московское ш., 101, кв.101","city": "Ленинград","postalCode": 101101
},
"phoneNumbers": [
"812 123-1234",
"916 123-4567"
]
}
К сожалению, в 1С нет процедур, способных преобразовывать информацию из формата JSON, поэтому придется писать самим. У меня стояла задача импорта заказов с сайта, поэтому пока рассмотрим только вариант преобразования JSON в стандартные объекты платформы 1С:Предприятие 8.3. Обратное преобразование выполняется проще, и его мы разберем в следующий раз.
Итак, нам понадобятся следующие функции и процедуры:
Первая функция выполняет первоначальную обработку данных в формате JSON и определяет какой из двух типов структур перед нами.
Результат = Новый Структура;
ТекстJSON = СтрЗаменить(ТекстJSON, """", """"); // заменим последовательность " на "
ТекстJSON = СтрЗаменить(ТекстJSON, """", ""); // а теперь удалим все кавычки
Если Лев(ТекстJSON, 1) = "{" Тогда // начало структуры
ЗаполнитьДанныеИзОтветаJSON(Результат, ТекстJSON, "Структура");
ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда //начало массива
МассивДанных = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(МассивДанных, ТекстJSON, "Массив");
Результат.Вставить("Значение", МассивДанных);
КонецЕсли;
Возврат Результат;
КонецФункции
Вторая процедура выполняет обработку данных и записывает их в массив или структуру. При этом возможна ситуация, когда структура данных в формате JSON сложная и при обработке мы получим структуру, значениями которой будут массивы, которые будут состоять из структур и т.д.
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2)); // удалим открывающий символ структуры(массива)
НомерЗначения = 0;
Пока ТекстJSON <> "" Цикл
ПервыйСимвол = Лев(ТекстJSON, 1);
Если ПервыйСимвол = "{" Тогда //вложенная структура
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
Если ТипДанных = "Структура" Тогда
Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;
ИначеЕсли ТипДанных = "Массив" Тогда
Результат.Добавить(Значение);
КонецЕсли;
ИначеЕсли ПервыйСимвол = "[" Тогда //вложенный массив
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
Если ТипДанных = "Структура" Тогда
Результат.Вставить("Значение" + ?(НомерЗначения = 0, "", НомерЗначения), Значение);
НомерЗначения = НомерЗначения + 1;
Иначе
Результат.Добавить(Значение);
КонецЕсли;
ИначеЕсли ПервыйСимвол = "}" И ТипДанных = "Структура" Тогда //структура закончилась
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
Если Лев(ТекстJSON, 1) = "," Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
КонецЕсли;
Возврат;
ИначеЕсли ПервыйСимвол = "]" И ТипДанных = "Массив" Тогда //массив закончился
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
Если Лев(ТекстJSON, 1) = "," Тогда
ТекстJSON = СокрЛП(Сред(ТекстJSON, 2));
КонецЕсли;
Возврат;
Иначе
Если ТипДанных = "Структура" Тогда
Поз = Найти(ТекстJSON, ":");
Если Поз = 0 Тогда
Прервать;
КонецЕсли;
ИмяЗначения = СокрЛП(Лев(ТекстJSON, Поз - 1));
ИмяЗначения = СтрЗаменить(ИмяЗначения, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз+1));
Если Лев(ТекстJSON, 1) = "{" Тогда //значение является структурой
Значение = Новый Структура;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Структура");
ИначеЕсли Лев(ТекстJSON, 1) = "[" Тогда //значение является массивом
Значение = Новый Массив;
ЗаполнитьДанныеИзОтветаJSON(Значение, ТекстJSON, "Массив");
Иначе // обычное значение
ПервыйКавычка = Ложь;
ПредпоследнийКавычка = Ложь;
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = """" Тогда
Если ПервыйКавычка Тогда
ПредпоследнийКавычка = Истина;
Иначе
ПервыйКавычка = Истина;
КонецЕсли;
КонецЕсли;
Если (Символ = "," И ((ПервыйКавычка И ПредпоследнийКавычка) Или (Не ПервыйКавычка И Не ПредпоследнийКавычка))) ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "";
Иначе
Значение = Лев(ТекстJSON, Поз - 1);
Значение = СтрЗаменить(Значение, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
КонецЕсли;
Значение = СокрЛП(Значение);
КонецЕсли;
Результат.Вставить(ИмяЗначения, Значение);
ИначеЕсли ТипДанных = "Массив" Тогда //обычное значение
Поз = 0;
Для Сч = 1 По СтрДлина(ТекстJSON) Цикл
Символ = Сред(ТекстJSON, Сч, 1);
Если Символ = "," ИЛИ Символ = "]" ИЛИ Символ = "}" Тогда
Поз = Сч;
Прервать;
КонецЕсли;
КонецЦикла;
Если Поз = 0 Тогда
Значение = ТекстJSON;
ТекстJSON = "";
Иначе
Значение = Лев(ТекстJSON, Поз - 1);
Значение = СтрЗаменить(Значение, """", "");
ТекстJSON = СокрЛП(Сред(ТекстJSON, Поз + ?(Сред(ТекстJSON, Поз, 1) = ",", 1, 0)));
КонецЕсли;
Значение = СокрЛП(Значение);
Результат.Добавить(Значение);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Таким образом мы импортировали данные из JSON в стандартные объекты платформы 1С:Предприятие, с которыми уже можно работать.
Спасибо! то что нужно!
Автор, спасибо! Единственное «но» — падает, если в полученном тексте есть запятые.
Как решение, можно в первую процедура вставить такой кусочек:
ЗапятыеСПереводомСтроки = «,»+Символы.ПС;
ТекстJSON = СтрЗаменить(ТекстJSON, ЗапятыеСПереводомСтроки, «%%%%»);
ТекстJSON = СтрЗаменить(ТекстJSON, «,», » «);
ТекстJSON = СтрЗаменить(ТекстJSON, «%%%%», ЗапятыеСПереводомСтроки);
Решение достаточно годное, мне помогло
ИмяИсходящегоФайла = ПолучитьИмяВременногоФайла(«.txt»);
Соединение = Новый HttpСоединение(Сервер);
Соединение.Получить(Параметры,ИмяИсходящегоФайла);
ФайлОтвета = Новый ЧтениеJSON;
ФайлОтвета.ОткрытьФайл(ИмяИсходящегоФайла);
мДанные = ПрочитатьJSON(ФайлОтвета);
платформа 8.3.7
>>Результат.Вставить(«Значение» + ?(НомерЗначения = 0, «», НомерЗначения), Значение);
В эту строку внесите корректировку формата. Если НомерЗначения превышает 1000, начинается форматирование номера с группировкой. Т.е. на выходе получится, например, «Значение1 000», а не «Значение1000».
А так огромаднейшее СПАСИБО!!!