实现如Cache2016的%DynamicObject与%DynamicArray的动态对象工具类 BSP.SYS.COM.ProxyObject与BSP.SYS.COM.ProxyArray(参考%DynamicObject、%DynamicArray、%ZEN.proxyObject、%ZEN.Auxiliary.jsonProvider、ext.util.JsonObject)
%FromJSON
将JSON字符串解析为ProxyObject或ProxyArray对象
/// str json字符串
/// ErrorMsg 错误信息
/// 返回值 ProxyObject或ProxyArray对象
ClassMethod %FromJSON(str, Output ErrorMsg)%FromObject
将COS对象转化为ProxyObject或ProxyArray对象
/// obj 对象
/// level 对象引用层级
/// dateFormatter 日期格式
/// timeFormatter 时间格式
/// 返回值 ProxyObject或ProxyArray对象
ClassMethod %FromObject(obj, level = 2, dateFormatter = 3, timeFormatter = 1) As ProxyObject%ToJSON
将ProxyObject或ProxyArray对象转为JSON字符串或字符流
/// outstrm json输出流
/// level 层级
Method %ToJSON(outstrm As %Stream.Object, level = 10) As %String%ToXML
将ProxyObject或ProxyArray对象转为XML字符串或字符流
/// outstrm xml输出流
/// level 层级
/// xmlname 对象xml节点名
Method %ToXML(outstrm As %Stream.Object, level = 10, xmlname = "ROOT") As %String%Set
为ProxyObject属性或ProxyArray元素赋值
/// key 属性名,或数组索引(从1开始)
/// value 元素值
/// type 类型
/// level 对象元素处理层级
Method %Set(key, value, type = "", level = 2) As ProxyObject也可以直接对属性或元素直接赋值
s obj.propName=xxx
s arr."1"=xxx%Get
获取属性或元素值,未定义的属性返回空
///key 属性名或数组索引(从1开始)
Method %Get(key)也可以直接获取属性或元素值
w obj.propName
w arr."1"%Remove
移除对象属性值或数组元素(数组的尚未完善)
///key 属性名或数组索引(从1开始)
Method %Remove(key)%Size
获取数组元素个数,注意如果对数组使用过%Remove移除中间元素,会获取不正确。例如获取数组元素个数然后遍历数组
/// d ##class(BSP.TEST.JSON).TestArray()
ClassMethod TestArray()
{
s arr=##class(BSP.SYS.COM.ProxyArray).%New()
d arr.%Push("小华").%Push("小明").%Push("小小").%Push("小丽")
s count=arr.%Size()
w "元素共"_count_"个,分别为",!
for i=1:1:count { //注意和%DynamicArray不同,元素索引是从1开始的
w i_":"_arr.%Get(i),!
}
}
%GetIterator
获取迭代器,用于遍历对象属性或者数组元素 对象属性遍历,例如
/// d ##class(BSP.TEST.JSON).TestIterator()
/// 属性遍历
ClassMethod TestIterator()
{
#dim obj As BSP.SYS.COM.ProxyObject
s obj=##class(BSP.SYS.COM.ProxyObject).%FromJSON( "{""name"":""小华"", ""age"":19,""sex"":""男"" }" )
#dim iter As BSP.SYS.COM.IteratorObject
s iter=obj.%GetIterator()
while (iter.%GetNext(.key,.value)) {
w key_":"_value,!
}
}
数组元素遍历,例如
/// d ##class(BSP.TEST.JSON).TestIterator2()
/// 元素遍历
ClassMethod TestIterator2()
{
#dim obj As BSP.SYS.COM.ProxyObject
s obj=##class(BSP.SYS.COM.ProxyObject).%FromJSON( "[""张三"",""李四"",""王二""]" )
#dim iter As BSP.SYS.COM.IteratorObject
s iter=obj.%GetIterator()
while (iter.%GetNext(.key,.value)) {
w key_":"_value,!
}
}

Comments
请在后台配置评论类型和相关的值。