Comments 11
Метод saveItemData может быть переработан с использованием стандартного механизма десериализации json<->bin.
$$$THROWONERROR(st, ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(ListColumnsJSON ,,.listColumns ,1)) преобразует ListColumnsJSON в экземпляр класса %Library.ListOfObjects.
$$$THROWONERROR(st, ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(ListColumnsJSON ,,.listColumns ,1)) преобразует ListColumnsJSON в экземпляр класса %Library.ListOfObjects.
+1
Да, действительно может. Но в таком случае у нас получится список объектов класса Front.Helpers.ListColumn, а не %Library.ArrayOfDataTypes.
Нам необходимо будет немного переделать код в тех местах, где он использует методы для работы с массивом.
Естественно, я так набросала быстренько, но ведь это еще не все.
Если пользоваться дебагером, что в нашем случае оказалось вполне реально(я вообще со студийным дебаггером немного в контрах), то можно увидеть ошибку при попытке использования стандартного(встроенного) конвертора как раз из-за отсутствия передаваемых параметров, ну и исправить ее. Чтобы стандартный метода заработал, нужно изменить сигнатуру метода %OnNew() в классе Front.Helpers.ListColumn. Сделать возможным, чтобы он принимал пустые строки.
Пожалуй, это хороший альтернативный вариант для данного случая.
Но вообще мне для работы с JSON и REST приложениями нравится Utils.JSON. В общем-то достаточно удобная вещь. С ее помощью можно формировать сложные структуры. Например JSON для объекта, имеющего внутри и списки и массивы данных, делать вложенные структуры. Наименовать JSON на выходе не только «childrens», но как-нибудь по другому=)
Нам необходимо будет немного переделать код в тех местах, где он использует методы для работы с массивом.
for {
set listColumn=listColumns.GetNext(.idx) //получаем один из объектов списка типа Front.Helpers.ListColumn
quit:idx=""
set fieldName = listColumn.Field //обращаемся к свойству класса напрямую, в fieldName запишется его значение
if (fieldName '= "ID") {
set $PROPERTY(obj,fieldName) =$PROPERTY(itemData,fieldName) //устанавливаем в свойство нашего объекта значение полученное из данных вкладки по имени поля
}
}
Естественно, я так набросала быстренько, но ведь это еще не все.
Если пользоваться дебагером, что в нашем случае оказалось вполне реально(я вообще со студийным дебаггером немного в контрах), то можно увидеть ошибку при попытке использования стандартного(встроенного) конвертора как раз из-за отсутствия передаваемых параметров, ну и исправить ее. Чтобы стандартный метода заработал, нужно изменить сигнатуру метода %OnNew() в классе Front.Helpers.ListColumn. Сделать возможным, чтобы он принимал пустые строки.
Пожалуй, это хороший альтернативный вариант для данного случая.
Но вообще мне для работы с JSON и REST приложениями нравится Utils.JSON. В общем-то достаточно удобная вещь. С ее помощью можно формировать сложные структуры. Например JSON для объекта, имеющего внутри и списки и массивы данных, делать вложенные структуры. Наименовать JSON на выходе не только «childrens», но как-нибудь по другому=)
+1
>на выходе не только «childrens», но как-нибудь по другомy
Можно с помощью класса %ZEN.proxyObject — подробнее в спойлере.
Можно с помощью класса %ZEN.proxyObject — подробнее в спойлере.
Генерация json
ClassMethod json()
{
set obj=##class(%ZEN.proxyObject).%New()
set obj.property = "value"
set obj.objproperty = ##class(%ZEN.proxyObject).%New()
set obj.objproperty.simpleproperty="value"
set obj.arrayofdt = ##class(%ListOfDataTypes).%New()
do obj.arrayofdt.Insert(1)
do obj.arrayofdt.Insert("string")
set obj.arrayofobj = ##class(%ListOfObjects).%New()
set obj2=##class(%ZEN.proxyObject).%New()
set obj2.property = "value"
do obj.arrayofobj.Insert(obj2)
do obj.arrayofobj.Insert(obj2)
do obj.%ToJSON() //object root
////////////////////////////////////////////////
set arrayofdt = ##class(%ListOfDataTypes).%New()
do arrayofdt.Insert(1)
do arrayofdt.Insert("string")
do ##class(%ZEN.Auxiliary.jsonProvider).%ObjectToJSON(arrayofdt) //array root, %ListOfObjects is pretty much the same
////////////////////////////////////////////////
set array(1) = $lb("Sam","M",20)
set array(2) = $lb("John","M",25)
set array(3) = $lb("Kate","F",30)
do ##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON($lb("name","sex","age"),.array)
}
{
set obj=##class(%ZEN.proxyObject).%New()
set obj.property = "value"
set obj.objproperty = ##class(%ZEN.proxyObject).%New()
set obj.objproperty.simpleproperty="value"
set obj.arrayofdt = ##class(%ListOfDataTypes).%New()
do obj.arrayofdt.Insert(1)
do obj.arrayofdt.Insert("string")
set obj.arrayofobj = ##class(%ListOfObjects).%New()
set obj2=##class(%ZEN.proxyObject).%New()
set obj2.property = "value"
do obj.arrayofobj.Insert(obj2)
do obj.arrayofobj.Insert(obj2)
do obj.%ToJSON() //object root
////////////////////////////////////////////////
set arrayofdt = ##class(%ListOfDataTypes).%New()
do arrayofdt.Insert(1)
do arrayofdt.Insert("string")
do ##class(%ZEN.Auxiliary.jsonProvider).%ObjectToJSON(arrayofdt) //array root, %ListOfObjects is pretty much the same
////////////////////////////////////////////////
set array(1) = $lb("Sam","M",20)
set array(2) = $lb("John","M",25)
set array(3) = $lb("Kate","F",30)
do ##class(%ZEN.Auxiliary.jsonProvider).%ArrayToJSON($lb("name","sex","age"),.array)
}
+1
а давайте сделаем предположение, что одно из полей с типом %Date ;)
+1
Спасибо за комментарий. Я Вам отвечу, как только снова доберусь до компьютера!
Я могла бы, конечно, сказать, что это же демо, я не все случаи рассматриваю. Но я с Вами соглашусь — это упущение, забыть про %Date! ;)
Я могла бы, конечно, сказать, что это же демо, я не все случаи рассматриваю. Но я с Вами соглашусь — это упущение, забыть про %Date! ;)
0
Дело не в полноте примера, а в скорее в том, что он, возможно, не совсем подходит.
Приведенный вами пример, можно, и, имхо, нужно реализовывать с помощью «стандартного» ООП — инкапсуляция, наследование, полиморфизм и т.д.
В том ключе, в котором вы описываете рефлексию, в качестве примера можно было бы привести систему класса " а у нас пользователь всё может настроить сам, без программирования ", с созданием новых типов данных, свойств и т.д.
Приведенный вами пример, можно, и, имхо, нужно реализовывать с помощью «стандартного» ООП — инкапсуляция, наследование, полиморфизм и т.д.
В том ключе, в котором вы описываете рефлексию, в качестве примера можно было бы привести систему класса " а у нас пользователь всё может настроить сам, без программирования ", с созданием новых типов данных, свойств и т.д.
+1
Да, я думала об этом.
Мне не хотелось просто рассказывать как работают перечисленные выше функции, это есть и в документации.
А как бы Вы сделали?
Мне не хотелось просто рассказывать как работают перечисленные выше функции, это есть и в документации.
А как бы Вы сделали?
0
говорится, что она (рефлексия) обычно используется программами, которые требуют проверки или изменения поведения приложения во время исполнения кода.
можно было бы привести систему класса " а у нас пользователь всё может настроить сам, без программирования", с созданием новых типов данных, свойств и т.д.
+1
Не знаю почему, но сразу за рефлексией в Cache, я почему-то подумал про телепортацию в масло. А вы? :)
0
Sign up to leave a comment.
Рефлексия в Caché