HISUI
Cache中转JSON字符
2021年04月27日 19时26分

Cache中转Json字符

Cache2016及以后的Cache版本中M原生支持Json转换,但在2010及以前的Cache版本中M不原生支持转换,只能自己编写方法来转对象,以下介绍我经常使用的方法。

ext.util.JsonObject类

ext.util.JsonObject为JSON转换的工具类,可把对象转出JSON字符串/字符流,对象转成XML模板打印串,把JSON字符串转成对象(只支持一层结构),且可定点取值,也可定点赋值。

对象转JSON流

Set Obj = ##Class(User.CTPaymode).%OpenId(2,0)
/*
Param : {Object} Obj 必填。
Param : {String} cn 可选项。类名,如:User.CTPaymode
Param : {ext.util.JsonObject} JsonObject对象 可选项。用于指定转换格式。
如果Obj承继自%XML.Adaptor,且某属性的XMLNAME参数有值,则使用XMLNAME值作Key,如pat_name
*/
// 取得Json字符流
Set JsonStream = ##class(ext.util.JsonObject).ObjToJsonStream(Obj)
// 取得Json字符串,会有截取风险。(先获得Json流,然后读取最大长度字符串。)
Set JsonStr = ##class(ext.util.JsonObject).ObjToJson(Obj)
Set Obj = ""

获得JSON字符串中值

Set JsonStr = "{""name"":""neer"",""age"":12,""company"":{""name"":""MediWay""},""children"":[{""name"":""sub1""},{""name"":""sub2""}]}"
Set JsonObj = ##class(ext.util.JsonObject).FromJSON(JsonStr)
do JsonObj.Put("sex","男").Put("addr","myaddr")  //任何JsonObj都可使用Put追加值
Write JsonObj.Get("sex") //男
Write JsonObj.Get("name") //neer
Write JsonObj.Get("age")  //12
Write JsonObj.Get("company","name")  //MediWay
Write JsonObj.Get("children",0,"name") //sub1 索引从0开始
Write JsonObj.Get("children",1,"name") //sub2

获得XML模板打印内容字符串

Set JsonObj = ##class(ext.util.JsonObject).%New()
Do JsonObj.Put("RegNo","11124567").Put("PatName","张三").Put("SignImg","http://xx/xx.png")
//得到前台XML打印的数据,不用繁锁拼串
Set XMLPrintData = JsonObj.GetPrintData()  //RegNo$c(2)1112^PatName$(2)张三^SignImg$c(2)http://xx/xx.png
Set JsonData = JsonObj.Json()  // {"RegNo":"11124567","PatName":"张三","SignImg":"http://xx/xx.png"}
// 得到排序后的请求参数
Set ReqData= JsonObj.ToGetParam() //PatName=张三&RegNo=11124567&SignImg=http://xx/xx.png

对象转JSON慢的问题

如果使用对象转JSON字符串,对象复杂,层深且行多时,系列化对象非常耗时,此时可以使用多维数组转JSON字符串优化速度。

Set Arr("name") = "neer", Arr("sex") = "男", Arr("age") = 12
For i=0:1:10000{ //从0开始时才会转成[{},{}],否则是转成{"1":{},"2":{},...}
    Set Arr("children",i,"name")="sub"_i
}
M @"tmp" = Arr
Set RtnObj = ##class(%GlobalCharacterStream).%New()
Do encode3^json("tmp",.RtnObj)
k @"tmp"
W rtnObj.Read() ///{"age":12,"children":[{"name":"sub0"},{"name":"sub1"},{"name":"sub2"},...],"name":"neer","sex":"男"}

对象转JSON (Boolean型)20211008

    Set Obj = ##class(BSP.SYS.DTO.Base).%New()
    Set Obj.success=1      //m中1表示真,0表示假。
    Set jsonObj = ##class(ext.util.JsonObject).%New()
    Set jsonObj.BooleanFormat = "true|false"   //表示转成不带双引号的true或false
    d ##class(ext.util.JsonObject).ObjectToJSONStream(Obj,.Stream,"",jsonObj)
    Set Obj="",jsonObj=""  
    Q Stream  // Stream.Read() => {"msg":"","results":[],"success":true} 

JSON字符串转M数组

ClassMethod tjson() [ ProcedureBlock = 0 ]
{
    Set json = "{""key"":""w\u0022ww"",""key1"":{""key2"":""w\u005Cww""},""name"":""wanghc""}"
    if $$decode^json(json,"PLIST")=0{
        w PLIST("name")_","_PLIST("key")_","_PLIST("key1","key2")
    }
}
ClassMethod tjson2() [ ProcedureBlock =1 ]
{
    Set json = "{""key"":""w\u0022ww"",""key1"":{""key2"":""w\u005Cww""},""name"":""wanghc""}"
    if $$decode^json(json,"PLIST")=0{
        m Arr = @"PLIST"
        w Arr("name")_","_Arr("key")_","_Arr("key1","key2")
    }
}
上一篇: 下一篇:

3条评论

  1. yunhaibao说道:

    很棒

    1. 111说道:

      heyhey

  2. chris说道:

    厉害

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

访问量: 379613