使用 cfm 中的 SerializeJSON 如何只输出数据部分?

using SerializeJSON from cfm how do I just output the Data portion?

SerializeJSON(cfquery) 

创建一个如下所示的 JSON:

"COLUMNS":["POINT","LOCATION"],"DATA":[["41.322365,-71.679251","Ashaway...

如何只输出 JSON 数据?

即...

[["41.322365,-71.679251","Ashaway...

示例查询

q = QueryNew( '' );
point = [ "41.322365,-71.679251" ];
location = [ "Ashaway" ];
QueryAddColumn( q,"point",point );
QueryAddColumn( q,"location",location );

CF10+ (使用"for row in query"语法)

data = [];
for( row in q ) {
    // append array of two values
    ArrayAppend( data, [ row.point, row.location ] );
}
data = SerializeJSON( data );

CF9.01

data = [];
for( row=1; row <= q.recordcount; row++ ) {
    rowdata = [];

    ArrayAppend( rowdata,q.point[ row ] );
    ArrayAppend( rowdata,q.location[ row ] );
    ArrayAppend( data,rowdata );
}
data = SerializeJSON( data );

结果:

[["41.322365,-71.679251","Ashaway"]]

我认为没有方便的方法来执行此操作,除非您可以修改序列化查询的代码;否则你将需要使用一些字符串操作。但是,假设您可以访问序列化查询的 CF 代码,这有点不正统但确实有效:

<!---Serialize and Deserialize the cfquery to shortcut obtaining a Structure--->
<cfset queryAsStruct = DeSerializeJSON(SerializeJSON(cfquery))>
<!---Now serialize the data key of the struct--->
<cfset dataJSON = SerializeJSON(queryAsStruct.data)>

正如我所说,也许不是最漂亮的……但似乎已经完成了。可能有更多 convenient/better 将 cfquery 转换为结构的实践方法,但这个方法对我来说是最少的代码行。

编辑:只是想解释一下为什么会这样。 JSON 字符串在被 ColdFusion 反序列化时不再被检测为查询对象,只是一个普通结构,因此 "DATA" 键被创建并填充。这样您就可以将其作为结构的键来访问。当 cfquery 是一个查询对象时,虽然仍然是 "struct" 类型的对象,但它有一些特殊的注意事项,可以防止您直接访问数据键(据我所知)。

我想我也遇到过同样的问题。我通过 ajax 调用向浏览器发送查询,需要循环遍历 JSON 字符串才能显示信息。 ColdFusion 的 serializeJSON 方法输出一个名为 COLUMNS 的一维数组和一个名为 DATA 的二维数组。

让我们假设您的 JSON 字符串已经返回并且 ajax 调用 "response" 变量。所以我们有 response.COLUMNS 和 response.DATA.

通过使用列名并查找其索引,您可以查明给定行的数据。从那里你可以做任何你想做的事。

var point;
var location;
for(i=0; i<response.COLUMNS.length; i++){
    point=response.DATA[i][response.COLUMNS.indexOf('POINT')];
    location=response.DATA[i][response.COLUMNS.indexOf('LOCATION')];
}