使用ColdFusion为HighCharts格式化JSON数据

时间:2012-03-30 15:39:46

标签: json coldfusion highcharts

所以我正在使用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?

2 个答案:

答案 0 :(得分:3)

您将要将查询转换为结构数组,然后在该数组上运行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>

编辑:这是Ben的博客文章,它启发了上述方法:http://www.bennadel.com/blog/124-Ask-Ben-Converting-a-Query-to-an-Array.htm

答案 1 :(得分:1)

你需要这样的东西(未经测试,但你明白了)

<cfscript>
data = [{name='Jane',y=13],{name='John',y=23},{name='Joe',y=19}];
</cfscript>

<cfoutput>#serializeJson(data)#</cfoutput>

你需要创建一个结构的Coldfusion数组(每个结构都有“name”和“y”作为成员).. 然后序列化它。您在上面序列化的是查询对象。通过你的代码看起来你意味着来序列化“arealist”变量 - 但是var可能不会正确,因为它不是结构数组 - 它是一个字符串列表。 / p>