在 ColdFusion 中创建嵌套 JSON
Creating Nested JSON in ColdFusion
我正在尝试创建一个类似于以下内容的 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 数据集?
在此先感谢您的帮助!
这是 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":}', "All") />
<cfset myqueryJSON = replace(myqueryJSON, column_match, newcolumns) />
您可以在 this Regex 101 Demo 找到我在 REReplace()
中使用的正则表达式的解释。它似乎适用于任意数量的列。
我正在尝试创建一个类似于以下内容的 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 数据集?
在此先感谢您的帮助!
这是 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":}', "All") />
<cfset myqueryJSON = replace(myqueryJSON, column_match, newcolumns) />
您可以在 this Regex 101 Demo 找到我在 REReplace()
中使用的正则表达式的解释。它似乎适用于任意数量的列。