我正在尝试创建类似于以下内容的JSON数据集:
'[{"COLUMNS":[{ "title": "NAME"}, { "title": "COUNTY"}],"DATA":[["John Doe","Fresno"],["Billy","Fresno"],["Tom","Kern"],["King Smith","Kings"]]}]'
在过去,我只需要使用一组结构,然后使用#serializeJSON(array)#生成简单的JSON,例如:
<cfset dataArray = ArrayNew(1) />
<cfoutput query="getData">
<cfset dataStruct = StructNew() >
<cfset dataStruct["date"] = getData.tempDate>
<cfset dataStruct["yaxis1"] = getData.Value>
<cfset dataStruct["label1"] = getData.Label>
</cfoutput>
<cfset ArrayAppend(dataArray,dataStruct) />
<cfoutput>#serializeJSON(dataArray)#</cfoutput>
生成:
[{"date":"2015-01-15 00:05:00","label1":"Depth","yaxis1":"0.940"},{"date":"2015-01-15 00:10:00","label1":"Depth","yaxis1":"0.940"}]
如何使用COLUMNS和DATA记录集创建嵌套的JSON数据集?
提前感谢您的帮助!
答案 0 :(得分:2)
这是ColdFusion在将查询对象序列化为JSON时使用的格式。如果要创建类似于以下内容的JSON对象:
[{"COLUMNS":[{ "title": "NAME"}, { "title": "COUNTY"}],"DATA":[["John Doe","Fresno"],["Billy","Fresno"],["Tom","Kern"],["King Smith","Kings"]]}]
你想要做的是:
<cfset myquery = queryNew("name,county", "CF_SQL_VARCHAR,CF_SQL_VARCHAR") /> <!--- The second parameter is optional but a good habit to get into --->
<cfset queryAddRow(myquery) />
<cfset querySetCell(myquery, "name", "John Doe") />
<cfset querySetCell(myquery, "county", "Fresno") />
<cfset queryAddRow(myquery) />
<cfset querySetCell(myquery, "name", "Billy") />
<cfset querySetCell(myquery, "county", "Fresno") />
<cfset queryAddRow(myquery) />
<cfset querySetCell(myquery, "name", "Tom") />
<cfset querySetCell(myquery, "county", "Kern") />
<cfset queryAddRow(myquery) />
<cfset querySetCell(myquery, "name", "King Smith") />
<cfset querySetCell(myquery, "county", "Kings") />
<cfset myqueryJSON = serializeJSON(myquery) />
<cfoutput>#myqueryJSON#</cfoutput>
从ColdFusion使用ColdFusion Web服务时,格式特别有用 - 您可以反序列化JSON对象并立即将其用作查询。不言而喻,您也可以使用<cfquery>
执行此操作:
<cfquery name="myquery" datasource="mydatasource">
SELECT name, county
FROM mytable
</cfquery>
<cfset myqueryJSON = serializeJSON(myquery) />
如果需要,有很多工具可以帮助您将结构或结构数组转换为查询。
根据OP的评论更新
我们有以下内容:
"COLUMNS":["NAME","COUNTY"]
需要采用以下格式:
"COLUMNS":[{ "title": "NAME"}, { "title": "COUNTY"}]
这个解决方案有点麻烦,如果你问我,我确定它有一个更优雅的,但它似乎确实起了我的测试:
<cfset column_match = REMatchNoCase('"columns":\[[^\]]+\]', myqueryJSON)[1] />
<cfset newcolumns = REReplace(column_match , '("[^"]+"(?=[,\]]))', '{"title":\1}', "All") />
<cfset myqueryJSON = replace(myqueryJSON, column_match, newcolumns) />
您可以在this Regex 101 Demo的REReplace()
找到我使用的正则表达式的说明。它似乎适用于任意数量的列。