如何阅读JSON数据

时间:2014-02-18 00:47:26

标签: jquery arrays json coldfusion

这可能是一个愚蠢的问题,但我真的希望有人可以帮助我。

我目前正在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()函数中获取数据的数组,而不是列表或任何其他元数据?或者,是否有一种简单的方法只从数据数组中获取内容,而没有其他数组?

5 个答案:

答案 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);
 }