因此,我正在使用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

10-04 15:57
查看更多