在ColdFusion中创建嵌套JSON

时间:2015-01-25 22:46:07

标签: json 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数据集?

提前感谢您的帮助!

1 个答案:

答案 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 DemoREReplace()找到我使用的正则表达式的说明。它似乎适用于任意数量的列。