在web开发里面,JSON是一种常见数据。经常需要从数据库返回JOSN数据。一种方法就是拼串组装JSON,这种可读性不好,还要处理转义符。可以借助M动态对象得到JSON串。
返回对象的JOSN串,这样就可以组装一个复杂的JSON对象串返回
set mianObj =##class(%DynamicObject).%New()
//默认工作小组
s mianObj.DefWGMachineDR=""
//默认状态
s mianObj.WorkStatus=""
//文件服务地址
s mianObj.FTPAddress=..GetFileService()
//对象的数组属性
s mianObj.SensitivityData=[]
s Sequence="" f s Sequence=$o(^dbo.BTSensitivityI("IndexSequence",Sequence)) q:Sequence="" d
.s RowID="" f s RowID=$o(^dbo.BTSensitivityI("IndexSequence",Sequence,RowID)) q:RowID="" d
..s Active=$lg($g(^dbo.BTSensitivityD(RowID)),6)
..i Active=0 q
..s oneObj =##class(%DynamicObject).%New()
..s oneObj.RowID=RowID
..s oneObj.Code=$lg($g(^dbo.BTSensitivityD(RowID)),2)
..s oneObj.CName=$lg($g(^dbo.BTSensitivityD(RowID)),3)
..s oneObj.Sequence=$lg($g(^dbo.BTSensitivityD(RowID)),6)
..s oneObj.Code=$lg($g(^dbo.BTSensitivityD(RowID)),2)
..d mianObj.SensitivityData.%Push(oneObj)
set ChildObj =##class(%DynamicObject).%New()
s ChildObj.ChildName="子对象属性"
s mianObj.Child=ChildObj
//返回JSON
q mianObj.%ToJSON()
返回JSON数组串
//对象的数组属性
s retArr=[]
s Sequence="" f s Sequence=$o(^dbo.BTSensitivityI("IndexSequence",Sequence)) q:Sequence="" d
.s RowID="" f s RowID=$o(^dbo.BTSensitivityI("IndexSequence",Sequence,RowID)) q:RowID="" d
..s Active=$lg($g(^dbo.BTSensitivityD(RowID)),6)
..i Active=0 q
..s oneObj =##class(%DynamicObject).%New()
..s oneObj.RowID=RowID
..s oneObj.Code=$lg($g(^dbo.BTSensitivityD(RowID)),2)
..s oneObj.CName=$lg($g(^dbo.BTSensitivityD(RowID)),3)
..s oneObj.Sequence=$lg($g(^dbo.BTSensitivityD(RowID)),6)
..s oneObj.Code=$lg($g(^dbo.BTSensitivityD(RowID)),2)
..d retArr.%Push(oneObj)
//返回JSON
q retArr.%ToJSON()
怎么把Query快速处理成JSON数组对象
/// 调用Query得到JSON数组对象
/// ClassName:类名
/// FuncName:Query名字
/// w ##Class(LIS.WS.DHCLISServiceBase).GetQueryJsonArr()
ClassMethod GetQueryJsonArr(ClassName, FuncName, P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions)
{
s ClassName=$g(ClassName)
s FuncName=$g(FuncName)
s P0=$g(P0),P1=$g(P1),P2=$g(P2),P3=$g(P3),P4=$g(P4),P5=$g(P5),P6=$g(P6),P7=$g(P7),P8=$g(P8),P9=$g(P9),P10=$g(P10),P11=$g(P11),P12=$g(P12),P13=$g(P13),Sessions=$g(Sessions)
s rsetNew=##class(%XML.DataSet).%New()
s rsetNew.ClassName = ClassName
s rsetNew.QueryName = FuncName
s rsetNew.NeedSchema=1
s rsetNew.DiffGram=0
s sc=rsetNew.Execute(P0, P1, P2, P3, P4, P5, P6, P7, P8, P9, P10, P11, P12, P13, Sessions)
s colCount=rsetNew.GetColumnCount()
set retArr=[]
While (rsetNew.Next())
{
s OneRow =##class(%DynamicObject).%New()
f i=1:1:colCount
{
s colName=rsetNew.GetColumnName(i)
s colValue=rsetNew.GetDataByName(colName)
s CodeStr="(OneRow,colValue) s OneRow."_colName_"=colValue"
x (CodeStr,.OneRow,colValue)
}
d retArr.%Push(OneRow)
}
q retArr
}
得到表一行数据的JSON
/// 得到一行数据的JSON对象
/// w ##Class(LIS.WS.DHCLISServiceBase).GetTableRowJson("dbo.SYSUser","113").%ToJSON()
/// TableName:表类名
/// RowID:数据主键,和TableObj二传1
/// TableObj:数据对象,和RowID二传1
ClassMethod GetTableRowLogJson(TableName, RowID, TableObj)
{
s TableName=$g(TableName)
s RowID=$g(RowID)
s TableObj=$g(TableObj)
s retArr=[]
s @"RetJsonObj =##class(%DynamicObject).%New()"
i $l(RowID) d
.//更新的这里不能用OpenId,用他取的数据是改了之后的对象
.//s @("Obj=##class("_TableName_").%OpenId("_RowID_")")
.s @("Obj=$g(^"_TableName_"D("_RowID_"))")
e d
.s @("Obj")=TableObj
s rset = ##class(%ResultSet).%New()
d rset.Prepare("select COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA='dbo' AND REPLACE(TABLE_NAME,'_','')='"_$REPLACE(TableName,"dbo.","")_"' Order by ORDINAL_POSITION")
s exeret=rset.Execute()
s colCount=rset.GetColumnCount()
s dealNum=0
s PropertyMap=""
s Index=0
While(rset.Next())
{
s colField=rset.GetColumnName(1)
s ColValue=rset.GetDataByName(colField)
s Index=Index+1
i $l(RowID) d
.i Index=1 d
..s @("RetJsonObj."_ColValue_"="_RowID)
.e d
..s @("RetJsonObj."_ColValue_"=$lg(Obj,"_Index_")")
e d
.s @("RetJsonObj."_ColValue_"=Obj."_ColValue)
}
d retArr.%Push(@"RetJsonObj")
q retArr
}
以上就是常用的组JSON操作