Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions src/Классы/ДесериализаторJson.os
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@
Возврат ПреобразоватьОбъект(ДесериализованныйОбъект, ТипОбъекта);
ИначеЕсли ТипОбъекта = Тип("Структура") Тогда
Возврат ПреобразоватьОбъект(ДесериализованныйОбъект, ТипОбъекта);
ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда
Возврат ПреобразоватьТаблицуЗначений(ДесериализованныйОбъект, ТипОбъекта);
ИначеЕсли ЭтоПользовательскийТип(ТипОбъекта) Тогда
Возврат ПреобразоватьПользовательскийТип(ДесериализованныйОбъект, ТипОбъекта);
Иначе
Expand Down Expand Up @@ -101,6 +103,45 @@

КонецФункции

Функция ПреобразоватьТаблицуЗначений(Объект, ТипОбъекта)

Результат = Новый ТаблицаЗначений;
КоличествоЭлементов = Объект.Количество();

Если КоличествоЭлементов = 0 Тогда
Возврат Результат;
КонецЕсли;

ИменаКолонок = Объект[0];
Если Не ТипЗнч(ИменаКолонок) = Тип("Массив") Тогда
Возврат Результат;
КонецЕсли;

КоличествоКолонок = ИменаКолонок.Количество();

Для Каждого ИмяКолонки Из ИменаКолонок Цикл
Результат.Колонки.Добавить(ИмяКолонки);
КонецЦикла;

Для ИндексЭлемента = 1 По КоличествоЭлементов - 1 Цикл
ЗначенияКолонок = Объект[ИндексЭлемента];
Если Не ТипЗнч(ЗначенияКолонок) = Тип("Массив") Тогда
Продолжить;
КонецЕсли;

СтрокаТаблицы = Результат.Добавить();
Для ИндексКолонки = 0 По Мин(КоличествоКолонок, ЗначенияКолонок.Количество()) - 1 Цикл
ИмяКолонки = ИменаКолонок[ИндексКолонки];
ЗначениеКолонки = ЗначенияКолонок[ИндексКолонки];
ПреобразованныйЭлемент = ПреобразоватьОбъектДесериализации(ЗначениеКолонки, ТипЗнч(ЗначениеКолонки));
СтрокаТаблицы[ИмяКолонки] = ПреобразованныйЭлемент;
КонецЦикла;
КонецЦикла;

Возврат Результат;

КонецФункции

Comment thread
Stivo182 marked this conversation as resolved.
Outdated
Функция ПреобразоватьОбъект(Объект, ТипОбъекта)

Результат = Новый(ТипОбъекта);
Expand Down
25 changes: 25 additions & 0 deletions src/Классы/СериализаторJson.os
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
Результат = ПреобразоватьМассив(Объект);
ИначеЕсли ТипОбъекта = Тип("Структура") ИЛИ ТипОбъекта = Тип("Соответствие") Тогда
Результат = ПреобразоватьСтруктуру(Объект);
ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда
Результат = ПреобразоватьТаблицуЗначений(Объект);
ИначеЕсли ЭтоПримитивныйТип(ТипОбъекта) Тогда
Результат = ПреобразоватьПримитивныйТип(Объект);
Иначе
Expand Down Expand Up @@ -91,6 +93,29 @@
Возврат Результат;
КонецФункции

Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений) Экспорт

Результат = Новый Массив();

ИменаКолонок = Новый Массив();
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ИменаКолонок.Добавить(Колонка.Имя);
КонецЦикла;
Результат.Добавить(ИменаКолонок);

Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл
ЗначенияКолонок = Новый Массив();
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]);
ЗначенияКолонок.Добавить(ПреобразованноеЗначение);
КонецЦикла;
Результат.Добавить(ЗначенияКолонок);
КонецЦикла;

Возврат Результат;

КонецФункции

Функция ПреобразоватьПримитивныйТип(Объект) Экспорт
Возврат Объект;
КонецФункции
Expand Down
38 changes: 38 additions & 0 deletions tests/Десериализация.os
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@
| ""Поле1"": ""значение1"",
| ""Поле2"": ""значение2""
| },
| ""Таблица"": [
| [""Колонка1"", ""Колонка2""],
| [1, 2],
| [""значение1"", true]
| ],
| ""Ссылка"": {
| ""number"": 2
| }
Expand All @@ -41,6 +46,13 @@
Ожидаем.Что(Объект.Структура.Поле1).Равно("значение1");
Ожидаем.Что(Объект.Структура.Поле2).Равно("значение2");

Ожидаем.Что(Объект.Таблица).ИмеетТип("ТаблицаЗначений");
Ожидаем.Что(Объект.Таблица).ИмеетДлину(2);
Ожидаем.Что(Объект.Таблица[0].Колонка1).Равно(1);
Ожидаем.Что(Объект.Таблица[0].Колонка2).Равно(2);
Ожидаем.Что(Объект.Таблица[1].Колонка1).Равно("значение1");
Ожидаем.Что(Объект.Таблица[1].Колонка2).Равно(Истина);

Ожидаем.Что(Объект.Ссылка).ИмеетТип("ТестовыйКласс");
Ожидаем.Что(Объект.Ссылка.Число).Равно(2);

Expand Down Expand Up @@ -372,3 +384,29 @@
Ожидаем.Что(Соотв["y"]).Равно(20);

КонецПроцедуры

&Тест
Процедура ДесериализацияКорневойТаблицыЗначений() Экспорт

// Дано
JSON = "[
| [""Колонка1"", ""Колонка2""],
| [1, 2],
| [""значение"", { ""x"": 1, ""y"": 2 }]
|]";
Десериализатор = Новый ДесериализаторJson();

// Когда
Таблица = Десериализатор.Десериализовать(JSON, Тип("ТаблицаЗначений"));

// Тогда
Ожидаем.Что(Таблица).ИмеетТип("ТаблицаЗначений");
Ожидаем.Что(Таблица).ИмеетДлину(2);
Ожидаем.Что(Таблица[0]["Колонка1"]).Равно(1);
Ожидаем.Что(Таблица[0]["Колонка2"]).Равно(2);
Ожидаем.Что(Таблица[1]["Колонка1"]).Равно("значение");
Ожидаем.Что(Таблица[1]["Колонка2"]).ИмеетТип("Структура");
Ожидаем.Что(Таблица[1]["Колонка2"]["x"]).Равно(1);
Ожидаем.Что(Таблица[1]["Колонка2"]["y"]).Равно(2);

КонецПроцедуры
4 changes: 4 additions & 0 deletions tests/Классы/ТестовыйКласс.os
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@
&Сериализуемое
Перем Соответствие Экспорт;

&Сериализуемое
&Тип("ТаблицаЗначений")
Перем Таблица Экспорт;

&Сериализуемое
&Тип("ТестовыйКласс")
Перем Ссылка Экспорт;
Expand Down
55 changes: 55 additions & 0 deletions tests/Сериализация.os
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@
ТестовыйКласс.Соответствие.Вставить("поле1", 1);
ТестовыйКласс.Соответствие.Вставить("поле2", 2);

ТестовыйКласс.Таблица = Новый ТаблицаЗначений();
ТестовыйКласс.Таблица.Колонки.Добавить("колонка1");
ТестовыйКласс.Таблица.Колонки.Добавить("колонка2");
Стр1 = ТестовыйКласс.Таблица.Добавить();
Стр1.Колонка1 = 1;
Стр1.Колонка2 = 2;
Стр2 = ТестовыйКласс.Таблица.Добавить();
Стр2.Колонка1 = 3;
Стр2.Колонка2 = 4;

ВторойТестовыйКласс = Новый ТестовыйКласс();
ВторойТестовыйКласс.Число = 2;

Expand Down Expand Up @@ -78,6 +88,15 @@
Ожидаем.Что(ПрочитанныйОбъект.Соответствие).ИмеетТип("Структура");
Ожидаем.Что(ПрочитанныйОбъект.Соответствие.поле1).Равно(1);
Ожидаем.Что(ПрочитанныйОбъект.Соответствие.поле2).Равно(2);

Ожидаем.Что(ПрочитанныйОбъект.Таблица).ИмеетТип("Массив");
Ожидаем.Что(ПрочитанныйОбъект.Таблица).ИмеетДлину(3);
Ожидаем.Что(ПрочитанныйОбъект.Таблица[0][0]).Равно("колонка1");
Ожидаем.Что(ПрочитанныйОбъект.Таблица[0][1]).Равно("колонка2");
Ожидаем.Что(ПрочитанныйОбъект.Таблица[1][0]).Равно(1);
Ожидаем.Что(ПрочитанныйОбъект.Таблица[1][1]).Равно(2);
Ожидаем.Что(ПрочитанныйОбъект.Таблица[2][0]).Равно(3);
Ожидаем.Что(ПрочитанныйОбъект.Таблица[2][1]).Равно(4);

Ожидаем.Что(ПрочитанныйОбъект.Ссылка).ИмеетТип("Структура");
Ожидаем.Что(ПрочитанныйОбъект.Ссылка.number).Равно(2);
Expand Down Expand Up @@ -259,6 +278,42 @@

КонецПроцедуры

&Тест
Процедура СериализацияКорневойТаблицыЗначений() Экспорт

// Дано
Таблица = Новый ТаблицаЗначений();
Таблица.Колонки.Добавить("x");
Таблица.Колонки.Добавить("y");

Стр1 = Таблица.Добавить();
Стр1.x = 1;
Стр1.y = 2;

Стр2 = Таблица.Добавить();
Стр2.x = "a";
Стр2.y = Новый Структура("x", 3);

Сериализатор = Новый СериализаторJson();

// Когда
JSON = Сериализатор.Сериализовать(Таблица);
Объект = ПрочитатьИзJSON(JSON);

// Тогда
// JSON-объект читается как Массив
Ожидаем.Что(Объект).ИмеетТип("Массив");
Ожидаем.Что(Объект).ИмеетДлину(3);
Ожидаем.Что(Объект[0][0]).Равно("x");
Ожидаем.Что(Объект[0][1]).Равно("y");
Ожидаем.Что(Объект[1][0]).Равно(1);
Ожидаем.Что(Объект[1][1]).Равно(2);
Ожидаем.Что(Объект[2][0]).Равно("a");
Ожидаем.Что(Объект[2][1]).ИмеетТип("Структура");
Ожидаем.Что(Объект[2][1]["x"]).Равно(3);

КонецПроцедуры

&Тест
Процедура СериализацияВсехПолейВключаяБезЭкспорт() Экспорт

Expand Down
Loading