diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" index bb5820a..5824f53 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" @@ -68,6 +68,8 @@ Возврат ПреобразоватьОбъект(ДесериализованныйОбъект, ТипОбъекта); ИначеЕсли ТипОбъекта = Тип("Структура") Тогда Возврат ПреобразоватьОбъект(ДесериализованныйОбъект, ТипОбъекта); + ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда + Возврат ПреобразоватьТаблицуЗначений(ДесериализованныйОбъект, ТипОбъекта); ИначеЕсли ЭтоПользовательскийТип(ТипОбъекта) Тогда Возврат ПреобразоватьПользовательскийТип(ДесериализованныйОбъект, ТипОбъекта); Иначе @@ -101,6 +103,44 @@ КонецФункции +Функция ПреобразоватьТаблицуЗначений(Объект, ТипОбъекта) + + Если Объект.Количество() = 0 Тогда + Возврат Неопределено; + КонецЕсли; + + Результат = Новый ТаблицаЗначений; + ДобавленныеКолонки = Новый Соответствие(); + + Для Каждого ЗначенияКолонок Из Объект Цикл + + Если Не (ТипЗнч(ЗначенияКолонок) = Тип("Структура") Или ТипЗнч(ЗначенияКолонок) = Тип("Соответствие")) Тогда + Продолжить; + КонецЕсли; + + СтрокаТаблицы = Результат.Добавить(); + + Для Каждого КлючИЗначение Из ЗначенияКолонок Цикл + + ИмяКолонки = КлючИЗначение.Ключ; + ЗначениеКолонки = КлючИЗначение.Значение; + + Если ДобавленныеКолонки[ИмяКолонки] = Неопределено Тогда + Результат.Колонки.Добавить(ИмяКолонки); + ДобавленныеКолонки.Вставить(ИмяКолонки, Истина); + КонецЕсли; + + ПреобразованныйЭлемент = ПреобразоватьОбъектДесериализации(ЗначениеКолонки, ТипЗнч(ЗначениеКолонки)); + СтрокаТаблицы[ИмяКолонки] = ПреобразованныйЭлемент; + + КонецЦикла; + + КонецЦикла; + + Возврат Результат; + +КонецФункции + Функция ПреобразоватьОбъект(Объект, ТипОбъекта) Результат = Новый(ТипОбъекта); @@ -146,8 +186,12 @@ ТипСвойства = Тип(ИмяТипа); КонецЕсли; + Если ЗначениеСвойства = Неопределено Тогда + Продолжить; + КонецЕсли; + ЗначениеСвойства = ПреобразоватьОбъектДесериализации(ЗначениеСвойства, ТипСвойства); - Если ТипСвойства <> Неопределено И ТипСвойства <> ТипЗнч(ЗначениеСвойства) Тогда + Если ТипСвойства <> ТипЗнч(ЗначениеСвойства) Тогда Лог.Ошибка("Тип свойства '%1' не соответствует ожидаемому типу '%2'", ТипЗнч(ЗначениеСвойства), ТипСвойства); Продолжить; КонецЕсли; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" index 26908b6..ce5b5c9 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\202\320\276\321\200Json.os" @@ -55,6 +55,8 @@ Результат = ПреобразоватьМассив(Объект); ИначеЕсли ТипОбъекта = Тип("Структура") ИЛИ ТипОбъекта = Тип("Соответствие") Тогда Результат = ПреобразоватьСтруктуру(Объект); + ИначеЕсли ТипОбъекта = Тип("ТаблицаЗначений") Тогда + Результат = ПреобразоватьТаблицуЗначений(Объект); ИначеЕсли ЭтоПримитивныйТип(ТипОбъекта) Тогда Результат = ПреобразоватьПримитивныйТип(Объект); Иначе @@ -91,6 +93,27 @@ Возврат Результат; КонецФункции +Функция ПреобразоватьТаблицуЗначений(ТаблицаЗначений) Экспорт + + Результат = Новый Массив(); + + Для Каждого СтрокаТаблицы Из ТаблицаЗначений Цикл + + ЗначенияКолонок = Новый Структура(); + + Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл + ПреобразованноеЗначение = ПреобразоватьОбъектСериализации(СтрокаТаблицы[Колонка.Имя]); + ЗначенияКолонок.Вставить(Колонка.Имя, ПреобразованноеЗначение); + КонецЦикла; + + Результат.Добавить(ЗначенияКолонок); + + КонецЦикла; + + Возврат Результат; + +КонецФункции + Функция ПреобразоватьПримитивныйТип(Объект) Экспорт Возврат Объект; КонецФункции diff --git "a/tests/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" "b/tests/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" index 8d8aa0f..979117e 100644 --- "a/tests/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" +++ "b/tests/\320\224\320\265\321\201\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" @@ -17,6 +17,16 @@ | ""Поле1"": ""значение1"", | ""Поле2"": ""значение2"" | }, + | ""Таблица"": [ + | { + | ""Колонка1"": 1, + | ""Колонка2"": 2 + | }, + | { + | ""Колонка1"": ""значение1"", + | ""Колонка2"": true + | } + | ], | ""Ссылка"": { | ""number"": 2 | } @@ -41,6 +51,13 @@ Ожидаем.Что(Объект.Структура.Поле1).Равно("значение1"); Ожидаем.Что(Объект.Структура.Поле2).Равно("значение2"); + Ожидаем.Что(Объект.Таблица).ИмеетТип("ТаблицаЗначений"); + Ожидаем.Что(Объект.Таблица).ИмеетДлину(2); + Ожидаем.Что(Объект.Таблица[0].Колонка1).Равно(1); + Ожидаем.Что(Объект.Таблица[0].Колонка2).Равно(2); + Ожидаем.Что(Объект.Таблица[1].Колонка1).Равно("значение1"); + Ожидаем.Что(Объект.Таблица[1].Колонка2).Равно(Истина); + Ожидаем.Что(Объект.Ссылка).ИмеетТип("ТестовыйКласс"); Ожидаем.Что(Объект.Ссылка.Число).Равно(2); @@ -372,3 +389,34 @@ Ожидаем.Что(Соотв["y"]).Равно(20); КонецПроцедуры + +&Тест +Процедура ДесериализацияКорневойТаблицыЗначений() Экспорт + + // Дано + JSON = "[ + | { + | ""Колонка1"": 1, + | ""Колонка2"": 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); + +КонецПроцедуры diff --git "a/tests/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\232\320\273\320\260\321\201\321\201.os" "b/tests/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\232\320\273\320\260\321\201\321\201.os" index e322fe5..82c9226 100644 --- "a/tests/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\232\320\273\320\260\321\201\321\201.os" +++ "b/tests/\320\232\320\273\320\260\321\201\321\201\321\213/\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\271\320\232\320\273\320\260\321\201\321\201.os" @@ -38,6 +38,10 @@ &Сериализуемое Перем Соответствие Экспорт; +&Сериализуемое +&Тип("ТаблицаЗначений") +Перем Таблица Экспорт; + &Сериализуемое &Тип("ТестовыйКласс") Перем Ссылка Экспорт; diff --git "a/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" "b/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" index fbe6760..5dcc7c0 100644 --- "a/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" +++ "b/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217.os" @@ -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; @@ -78,6 +88,13 @@ Ожидаем.Что(ПрочитанныйОбъект.Соответствие).ИмеетТип("Структура"); Ожидаем.Что(ПрочитанныйОбъект.Соответствие.поле1).Равно(1); Ожидаем.Что(ПрочитанныйОбъект.Соответствие.поле2).Равно(2); + + Ожидаем.Что(ПрочитанныйОбъект.Таблица).ИмеетТип("Массив"); + Ожидаем.Что(ПрочитанныйОбъект.Таблица).ИмеетДлину(2); + Ожидаем.Что(ПрочитанныйОбъект.Таблица[0]["колонка1"]).Равно(1); + Ожидаем.Что(ПрочитанныйОбъект.Таблица[0]["колонка2"]).Равно(2); + Ожидаем.Что(ПрочитанныйОбъект.Таблица[1]["колонка1"]).Равно(3); + Ожидаем.Что(ПрочитанныйОбъект.Таблица[1]["колонка2"]).Равно(4); Ожидаем.Что(ПрочитанныйОбъект.Ссылка).ИмеетТип("Структура"); Ожидаем.Что(ПрочитанныйОбъект.Ссылка.number).Равно(2); @@ -259,6 +276,40 @@ КонецПроцедуры +&Тест +Процедура СериализацияКорневойТаблицыЗначений() Экспорт + + // Дано + Таблица = Новый ТаблицаЗначений(); + Таблица.Колонки.Добавить("x"); + Таблица.Колонки.Добавить("y"); + + Стр1 = Таблица.Добавить(); + Стр1.x = 1; + Стр1.y = 2; + + Стр2 = Таблица.Добавить(); + Стр2.x = "a"; + Стр2.y = Новый Структура("x", 3); + + Сериализатор = Новый СериализаторJson(); + + // Когда + JSON = Сериализатор.Сериализовать(Таблица); + Объект = ПрочитатьИзJSON(JSON); + + // Тогда + // JSON-объект читается как Массив + Ожидаем.Что(Объект).ИмеетТип("Массив"); + Ожидаем.Что(Объект).ИмеетДлину(2); + Ожидаем.Что(Объект[0]["x"]).Равно(1); + Ожидаем.Что(Объект[0]["y"]).Равно(2); + Ожидаем.Что(Объект[1]["x"]).Равно("a"); + Ожидаем.Что(Объект[1]["y"]).ИмеетТип("Структура"); + Ожидаем.Что(Объект[1]["y"]["x"]).Равно(3); + +КонецПроцедуры + &Тест Процедура СериализацияВсехПолейВключаяБезЭкспорт() Экспорт