/
smwwiki
/
OneScript_fork
Обзор
Документация
Войти
/
smwwiki
/
OneScript_fork
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
tests/json/json_dataExtractor.os
373 строки
18 KB
Artem Kuznetsov
feat: Реализован класс для извлечения данных из JSON по казанному пути JSON-path (+тесты).
20 окт 2022, 13:53
20 окт 2022, 13:53
5aaed0d
Код
Авторство
О чём код?
Перем юТест; //////////////////////////////////////////////////////////////////// // Программный интерфейс Функция ПолучитьСписокТестов(Тестирование) Экспорт юТест = Тестирование; ВсеТесты = Новый Массив; ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИзСтрокиJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИзФайлаJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИзПотокаJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьСтроковоеЗначениеИзJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьЦелоеЧислоИзJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьПлавающееЧислоИзJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьСтрокуJSONИзJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьСоответствиеИзJSON"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИПосчитатьКоличество"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИПосчитатьСумму"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИПосчитатьСреднее"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИПосчитатьМинимум"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИПосчитатьМаксимум"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИВыбратьПервоеЗначение"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИВыбратьПоследнееЗначение"); ВсеТесты.Добавить("ТестДолжен_ИзвлечьДанныеИВыбратьПоляОбъекта"); Возврат ВсеТесты; КонецФункции // ПолучитьСписокТестов() Процедура ТестДолжен_ИзвлечьДанныеИзСтрокиJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$.Manufacturers[?(@.Name == 'Acme Co')].Name"); ТестовоеЗначение = "Acme Co"; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИзСтрокиJSON() Процедура ТестДолжен_ИзвлечьДанныеИзФайлаJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); ПутьКТестовомуКаталогу = ОбъединитьПути(ТекущийСценарий().Каталог, "test"); ОбеспечитьКаталог(ПутьКТестовомуКаталогу); ИмяТестовогоФайла = "testFile1.json"; ПутьКФайлу = ОбъединитьПути(ПутьКТестовомуКаталогу, ИмяТестовогоФайла); Текст = Новый ТекстовыйДокумент(); Текст.УстановитьТекст(ДанныеJSON()); Текст.Записать(ПутьКФайлу, КодировкаТекста.UTF8); ИзвлечениеДанных.ОткрытьФайл(ПутьКФайлу, КодировкаТекста.UTF8); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Name == 'Anvil')].Price"); ТестовоеЗначение = 50; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); УдалитьФайлы(ПутьКТестовомуКаталогу); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИзФайлаJSON() Процедура ТестДолжен_ИзвлечьДанныеИзПотокаJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); ПутьКТестовомуКаталогу = ОбъединитьПути(ТекущийСценарий().Каталог, "test"); ОбеспечитьКаталог(ПутьКТестовомуКаталогу); ИмяТестовогоФайла = "testFile1.json"; ПутьКФайлу = ОбъединитьПути(ПутьКТестовомуКаталогу, ИмяТестовогоФайла); Текст = Новый ТекстовыйДокумент(); Текст.УстановитьТекст(ДанныеJSON()); Текст.Записать(ПутьКФайлу, КодировкаТекста.UTF8); Поток = Новый ФайловыйПоток(ПутьКФайлу, РежимОткрытияФайла.Открыть); ИзвлечениеДанных.ОткрытьПоток(Поток, КодировкаТекста.UTF8); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Name == 'Anvil')].Price"); ТестовоеЗначение = 50; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); УдалитьФайлы(ПутьКТестовомуКаталогу); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИзФайлаJSON() Процедура ТестДолжен_ИзвлечьСтроковоеЗначениеИзJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Price >= 50 && @.Name == 'Elbow Grease')].Name"); ТестовоеЗначение = "Elbow Grease"; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьСтроковоеЗначениеИзJSON() Процедура ТестДолжен_ИзвлечьЦелоеЧислоИзJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Name == 'Anvil')].Price"); ТестовоеЗначение = 50; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьЦелоеЧислоИзJSON() Процедура ТестДолжен_ИзвлечьПлавающееЧислоИзJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Price >= 50 && @.Name == 'Elbow Grease')].Price"); ТестовоеЗначение = 99.95; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьПлавающееЧислоИзJSON() Процедура ТестДолжен_ИзвлечьСтрокуJSONИзJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Price >= 50)]"); ТестовоеЗначение = "[ |{ |""Name"": ""Anvil"", |""Price"": 50 |}, |{ |""Name"": ""Elbow Grease"", |""Price"": 99.95 |} |]"; Результат = СтрЗаменить(Результат, Символы.ВК, ""); ТестовоеЗначение = СтрЗаменить(ТестовоеЗначение, Символы.ВК, ""); юТест.ПроверитьРавенство(СокрЛП(Результат), ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьСтрокуJSONИзJSON() Процедура ТестДолжен_ИзвлечьСоответствиеИзJSON() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Price >= 50)]", Истина, Ложь); // "[ // | { // | ""Name"": ""Anvil"", // | ""Price"": 50 // | }, // | { // | ""Name"": ""Elbow Grease"", // | ""Price"": 99.95 // | } // |]"; юТест.ПроверитьРавенство(Результат.Количество(), 2, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьСоответствиеИзJSON() Процедура ТестДолжен_ИзвлечьДанныеИПосчитатьКоличество() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Price >= 50)].Price.length()"); юТест.ПроверитьРавенство(Результат, 2, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИПосчитатьКоличество() Процедура ТестДолжен_ИзвлечьДанныеИПосчитатьСумму() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[*].Price.sum()"); юТест.ПроверитьРавенство(Результат, 153.95, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИПосчитатьСумму() Процедура ТестДолжен_ИзвлечьДанныеИПосчитатьСреднее() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[*].Price.avg()"); юТест.ПроверитьРавенство(Окр(Результат, 3), 51.317, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИПосчитатьСреднее() Процедура ТестДолжен_ИзвлечьДанныеИПосчитатьМаксимум() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[*].Price.max()"); юТест.ПроверитьРавенство(Результат, 99.95, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИПосчитатьМаксимум() Процедура ТестДолжен_ИзвлечьДанныеИПосчитатьМинимум() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[*].Price.min()"); юТест.ПроверитьРавенство(Результат, 4, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИПосчитатьМинимум() Процедура ТестДолжен_ИзвлечьДанныеИВыбратьПервоеЗначение() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[*].first()"); Результат = СтрЗаменить(Результат, Символы.ПС, ""); Результат = СтрЗаменить(Результат, Символы.ВК, ""); Результат = СокрЛП(Результат); ТестовоеЗначение = "{""Name"": ""Anvil"",""Price"": 50}"; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИВыбратьПервоеЗначение() Процедура ТестДолжен_ИзвлечьДанныеИВыбратьПоследнееЗначение() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[*].last()"); Результат = СтрЗаменить(Результат, Символы.ПС, ""); Результат = СтрЗаменить(Результат, Символы.ВК, ""); Результат = СокрЛП(Результат); ТестовоеЗначение = "{""Name"": ""Headlight Fluid"",""Price"": 4}"; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИВыбратьПоследнееЗначение() Процедура ТестДолжен_ИзвлечьДанныеИВыбратьПоляОбъекта() Экспорт ИзвлечениеДанных = Новый ИзвлечениеДанныхJSON(); СтрокаJSON = ДанныеJSON(); ИзвлечениеДанных.УстановитьСтроку(СтрокаJSON); Результат = ИзвлечениеДанных.Выбрать("$..Products[?(@.Price > 50)].keys()"); Результат = СтрЗаменить(Результат, Символы.ПС, ""); Результат = СтрЗаменить(Результат, Символы.ВК, ""); Результат = СокрЛП(Результат); ТестовоеЗначение = "[""Name"",""Price""]"; юТест.ПроверитьРавенство(Результат, ТестовоеЗначение, "Ошибка выборки данных из JSON"); КонецПроцедуры // ТестДолжен_ИзвлечьДанныеИВыбратьПоляОбъекта() Процедура ОбеспечитьКаталог(ПутьККаталогу) ВремКаталог = Новый Файл(ПутьККаталогу); Если НЕ (ВремКаталог.Существует() И ВремКаталог.ЭтоКаталог()) Тогда СоздатьКаталог(ПутьККаталогу); КонецЕсли; КонецПроцедуры // ОбеспечитьКаталог() Функция ДанныеJSON() Возврат "{ | ""Stores"": [ | ""Lambton Quay"", | ""Willis Street"" | ], | ""Manufacturers"": [ | { | ""Name"": ""Acme Co"", | ""Products"": [ | { | ""Name"": ""Anvil"", | ""Price"": 50 | } | ] | }, | { | ""Name"": ""Contoso"", | ""Products"": [ | { | ""Name"": ""Elbow Grease"", | ""Price"": 99.95 | }, | { | ""Name"": ""Headlight Fluid"", | ""Price"": 4 | } | ] | } | ] |}"; КонецФункции // ДанныеJSON()