在 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() 中使用的正则表达式的解释。它似乎适用于任意数量的列。