这可能是一个愚蠢的问题,但我真的希望有人可以帮助我。
我目前正在ColdFusion 10中使用serializeJson()
来生成JSON数据集,以便我可以在jquery表插件中处理数据。 serializeJson()生成以下JSON数据:
{
-COLUMNS: [
"AMOUNT"
"AMOUNTPAID"
"ENTITY"
"ENTITY_NAME"
"FORMULACURRENCY"
"INTERNALID"
"TRANDATE"
"TRANID"
"TYPE"
"TYPE_INTERNALID"
]
-DATA: [
...
我的插件似乎只处理非常基本的JSON。
[{"rank":1,"title":"The Avengers (2012)","weekend":"$103M","gross":"$373M","weeks":2},
{"rank":2,"title":"Dark Shadows (2012)","weekend":"$29.7M","gross":"$29.7M","weeks":1},
{"rank":3,"title":"Think Like a Man (2012)","weekend":"$5.82M","gross":"$81.4M","weeks":4},
{"rank":4,"title":"The Hunger Games (2012)","weekend":"$4.51M","gross":"$387M","weeks":8},
{"rank":5,"title":"The Lucky One (2012)","weekend":"$4.11M","gross":"$53.8M","weeks":4},
{"rank":6,"title":"The Five-Year Engagement (2012)","weekend":"$3.31M","gross":"$24.6M","weeks":3},
{"rank":7,"title":"The Pirates! Band of Misfits (2012)","weekend":"$3.14M","gross":"$23M","weeks":3},
{"rank":8,"title":"The Best Exotic Marigold Hotel (2011)","weekend":"$2.67M","gross":"$3.74M","weeks":2},
{"rank":9,"title":"Chimpanzee (2012)","weekend":"$1.76M","gross":"$25.7M","weeks":4},
{"rank":10,"title":"Safe (2012)","weekend":"$1.45M","gross":"$15.7M","weeks":3}];
如何从ColdFusion的serializeJson()函数中获取数据的数组,而不是列表或任何其他元数据?或者,是否有一种简单的方法只从数据数组中获取内容,而没有其他数组?
答案 0 :(得分:6)
你的问题有点模糊,但我会尝试回答。
serializeJson()
和deserializeJson()
只能完全按照他们对锡的说法:将原生CFML数据结构转换为JSON格式的字符串。他们不会自己决定翻译的结构。
您的jQuery插件需要一个JavaScript对象数组,这意味着您需要创建JavaScript对象和数组。关于如何在CFML类型和JSONified JS类型之间转换数据的一点是,CFML结构将序列化为JS对象。
因此,如果您从CFML记录集开始......您需要考虑如何使用它来创建结构数组。我建议你为每一行都有一个结构,每个行都是数组中的一个元素。
所以你想要这样的东西:
create an array
loop over the recordset
create a struct out of each column value of the current row
append that struct to the array
/loop
serialise the array to JSON
没有一次性/内置功能可将记录集对象转换为结构数组。你需要手工完成。
答案 1 :(得分:2)
您是否尝试过将serializeQueryByColumns
设为true
?看看你是否更喜欢这种风格。
http://help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/WSc3ff6d0ea77859461172e0811cbec22c24-79fa.html
答案 2 :(得分:2)
我出于这个原因构建了ArrayCollection.cfc。我需要轻松地将ColdFusion查询转换为更标准的JSON格式。有一个blog post涵盖了用例。
它根据查询对象的内容创建一个结构数组或一个数组数组,然后将其序列化。
<cfset rs.ac = createObject("component", "ArrayCollection").init() />
<cfset rs.ac.setData( myQuery ) />
<cfreturn rs.ac.$renderdata() />
这将输出此默认JSON格式:
{
"data":[
{
"bookid":8,
"genre":"Fiction",
"title":"Apparition Man"
},
{
"bookid":2,
"genre":"Non-fiction",
"title":"Shopping Mart Mania"
}
]
}
您可以关闭“数据”键或根据需要更改其值。
答案 3 :(得分:1)
我通常这样做:
<cfset tempList = "AMOUNT,AMOUNTPAID,ENTITY,ENTITY_NAME,FORMULACURRENCY,INTERNALID">
<cfsavecontent variable="tempJSON"> [
<cfloop query="#yourQry#">
<cfset counterTwo=0>
{
<cfloop list="#tempList#" index="columnname">
<cfset counterTwo=counterTwo+1>
#columnname#:
<cfif IsNumeric(serializeJson(trim(Evaluate('#columnname#'))))>
"#trim(Evaluate('yourQry.#columnname#'))#"
<cfelse>
#serializeJson(trim(Evaluate('yourQry.#columnname#')))#
</cfif>
<cfif counterTwo IS NOT ListLen(tempList))>
,
</cfif>
</cfloop>
}
<cfif currentrow IS NOT recordcount>
,
</cfif>
</cfloop> ]
</cfsavecontent>
所以只需用你的数组替换我的查询,我就是在循环列,因为我有动态列,所以它们是用户特定的。如果您的JSON具有固定数量的密钥,那么您不必遍历列表,您可以手动指定它。
像这样你创建你的JSON并将它传递给jQuery表插件。
答案 4 :(得分:0)
您也可以轻松地在客户端执行此操作。
$.standardiseCfQueryJSON=function( cfQueryJSON )
{
var result = [];
$.each( cfQueryJSON.DATA,function( rowNum,rowValue ){
var row = new Object();
$.each( cfQueryJSON.COLUMNS,function( position,columnName ){
row[ columnName.toLowerCase() ] = rowValue[ position ];
});
result.push( row );
});
return result;
};
在AJAX调用中,只需将数据转换为有效的JSON格式并使用它,
success: function(response){
data = $.standardiseCfQueryJSON(response);
}