使用ColdFusion为HighCharts格式化JSON数据



所以我正在使用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可能也不正确,因为它不是一个结构数组,它是一个字符串列表。

最新更新