使用 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')];
}
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')];
}