所以我正在使用HighSlide和ColdFusion制作饼图。
为了简单起见,对于数据,它需要一个这样的字符串:
data: [{name: 'Jane',y: 13}, {name: 'John',y: 23}, {name: 'Joe',y: 19}]
为了实现这一点,我所做的是循环查询结果并创建一个字符串,如下所示:
<cfloop query="getAreaCounts">
<cfset areaList = listAppend(areaList, "{name: '#name#',y: #y#}")>
</cfloop>
我知道必须有一个更简单/更聪明的方法,对吧?由于这是JSON数据,我想我可以这样做:
<cfoutput>#SerializeJSON(getAreaCounts)#</cfoutput>
但这会返回一个类似于这样的JSON字符串,highcharts不会处理:
{"COLUMNS":["Y","NAME"],"DATA":[[8,"Area1"],[7,"Area2"],[1,"Area3"],[1,"Area4"]]}
任何能帮我指明正确方向的人都会很棒。我需要更深入地研究JSON-howto吗?
您需要将查询转换为结构数组,然后在该数组上运行serializeJSON()
。
下面是我在处理大量查询和JSON时经常使用的方法。我想我是从Ben Nadel的网站上得到的,然后把它转换成了cfscript。。在我发布这个答案后,我会努力追踪博客文章。
public array function queryToArray( required query qry ) {
var columns = arguments.qry.getColumnNames();
var ofTheJedi = [];
for( var i = 1; i LTE qry.recordCount; i++ ) {
var obj = {};
for( var k = 1; k LTE arrayLen( columns ); k++ ) {
structInsert( obj, columns[ k ], arguments.qry[ columns[ k ] ][ i ] );
}
arrayAppend( ofTheJedi, obj );
}
return ofTheJedi;
}
所以,在你的情况下,你会做这样的事情:
<cfset myJSON = queryToArray( getAreaCounts ) />
<cfoutput>#serializeJSON( myJSON )#</cfoutput>
编辑:本的博客文章启发了上述方法:http://www.bennadel.com/blog/124-Ask-Ben-Converting-a-Query-to-an-Array.htm
你需要这样的东西(未经测试,但你明白了)
<cfscript>
data = [{name='Jane',y=13],{name='John',y=23},{name='Joe',y=19}];
</cfscript>
<cfoutput>#serializeJson(data)#</cfoutput>
您需要创建一个结构的Coldfusion数组(每个结构都有"name"one_answers"y"作为成员)然后序列化它。上面序列化的是查询对象。根据您的代码,看起来您的意思是序列化"arealist"变量,但这个var可能也不正确,因为它不是一个结构数组,它是一个字符串列表。