09月08, 2021

Caché JSON处理

实现如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),!
    }
}

QQ截图20210924094520.png

%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,!    
    }
}

QQ截图20210924093702.png

数组元素遍历,例如

/// 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,!    
    }
}

QQ截图20210924093726.png

下载地址

本文链接:http://blog.ttykx.com/post/cache-json.html

-- EOF --

Comments

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