Cache2016及以后的Cache版本中M原生支持Json转换,但在2010及以前的Cache版本中M不原生支持转换,只能自己编写方法来转对象,以下介绍我经常使用的方法。
ext.util.JsonObject为JSON转换的工具类,可把对象转出JSON字符串/字符流,对象转成XML模板打印串,把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 = ""
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
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字符串
优化速度。
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":"男"}
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}
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")
}
}
访问量: 509894
很棒
heyhey
厉害