2014-02-18 135 views
0

這可能是一個愚蠢的問題,但我真的希望有人能幫助我。如何閱讀JSON數據

我目前在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}]; 

一個人如何只得到數據,而不是columnlist或任何其他元數據的數組,從ColdFusion的serializeJson()函數?或者,還有一種簡單的方法可以僅從數據數組中獲取內容,而不使用其他數組?

回答

6

你的問題有點含糊,但我會盡力回答。

serializeJson()deserializeJson()只能正確地做他們在錫上說的話:將本機CFML數據結構轉換爲/從JSON格式的字符串。他們本身並不決定翻譯的結構。

您的jQuery插件需要一個JavaScript對象數組,這意味着您需要創建和JavaScript對象數組。一個點頭在這裏指出如何在CFML類型和JSON化的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

我經常這樣做:

<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表插件。

+0

不會這樣引入大量的空格呢?我不確定tempJSON是否是有效的JSON字符串。 – Henry

+0

它不會引入空格,它將是一個有效的JSON字符串。我正在使用jqGrid來顯示我的表格,並且我只是返回此JSON並在數據字段中使用#returnedJSON#。完美的作品。我在我的應用程序中隨處使用它。試一試。 – mayurc

+0

不錯,很棒,我想我有'cfsavecontent'的歷史。 – Henry

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" 
     } 
    ] 
}

您可以打開「數據」鍵關機,或根據需要改變它的值。

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