2016-09-23 48 views
1

我試圖解析ColdFusion的JSON數據,使它看起來 「正常」 ColdFusion的JSON:解析ColdFusion的JSON javascript函數 - 未捕獲的ReferenceError:未定義WddxRecordset

{"ROWCOUNT":3,"COLUMNS":["ROWID","REL","DATE","FOA","TITLE","APPRECEIPE","OPENING","KEYWORDS","DOC","PURPOSE","APP","NAME","PURPOSE"],"DATA":{"ROWID":[24842,24841,23780],"REL":["032","031","108"], ...

搜查網頁,發現此鏈接:

http://www.tysoncadenhead.com/blog/parsing-coldfusion-json-on-the-client-side#.V-UpKfkrKUk

他提供使用此功能:

Object.prototype.parseCFJSON = function() { 
var result = [], 
    data = this; 
for (var j = 0; j < data.DATA.length; j++) { 
    result[j] = {}; 
    for (var i = 0; i < data.COLUMNS.length; i++) { 
    result[j][data.COLUMNS[i].toLowerCase()] = data.DATA[j][i]; 
    } 
} 
return result; 
}; 

這裏是我的代碼

<cfset jsonURL = SerializeJSON(SmartGuideSearchRet,true)> 
<cfset URLd = #SmartGuideSearchRet#> //My CF Struct 
<script> 
<cfoutput> 
var #toScript(URLd,"URLd")#; 
</cfoutput> 
Object.prototype.parseCFJSON = function() { 

var result = [], 
    data = this; 

for (var j = 0; j < data.DATA.length; j++) { 
    result[j] = {}; 
    for (var i = 0; i < data.COLUMNS.length; i++) { 
    result[j][data.COLUMNS[i].toLowerCase()] = data.DATA[j][i]; 
    } 
} 

return result; 
}; 
ujsonURL = URLd.parseCFJSON(); 
console.log(ujsonURL); 
</script> 

我的控制檯給我這個錯誤Uncaught ReferenceError: WddxRecordset is not defined

當我嘗試了JSON的ColdFusion數據提供給這個函數是這樣的:

<script> 
<cfoutput> 
var #toScript(URLd,"URLd")#; 
</cfoutput> 
Object.prototype.parseCFJSON = function() { 

var result = [], 
    data = this; 

for (var j = 0; j < data.DATA.length; j++) { 
    result[j] = {}; 
    for (var i = 0; i < data.COLUMNS.length; i++) { 
    result[j][data.COLUMNS[i].toLowerCase()] = data.DATA[j][i]; 
    } 
} 

return result; 
}; 
ujsonURL = jsonURL.parseCFJSON(); 
console.log(ujsonURL); 
</script> 

我得到這個錯誤:

Uncaught TypeError: Cannot read property 'length' of undefined

在該行

for (var j = 0; j < data.DATA.length; j++) {

我做錯了什麼,我真的很爲難。任何幫助,將不勝感激。我可能會完全錯誤地使用js函數(仍在學習)。

+0

對不起,我搞砸了我的評論:在你的第二個片段:jsonURL仍然定義,對吧? 你有沒有試過在控制檯輸出你的數據變量,以確切地看到什麼被傳遞給函數? – Esten

+0

@Esten當我嘗試傳遞給它時,我收到了這些錯誤。 – Ren44

+0

我說的是,如果你把'console.log(this)'放在錯誤的'for'條件之前。它基本上是說它無法找到'data.DATA'的值,所以我很好奇''這個''的值是什麼,在'for'之前什麼也沒找到,可能是 – Esten

回答

0

將「struct」傳遞給你的serializeJson函數也適用於我。

SerializeJSON(var,「struct」);

1

您是否考慮將ColdFusion JSON數據轉換回ColdFusion查詢對象,然後使用JSONUtil將其重新轉換回json?

JSONUtil對CF7-2016具有更好的JSON支持,「strictMapping」&「serializeQueryByColumns」支持。

<cfscript> 
JSONString = {}; /* This needs to be the ColdFusion JSON query */ 
JSONUtil = CreateObject("component","JSONUtil"); 
QueryData = JSONUtil.DeserializeJSON(JSONString, false); 
JSON_oldWDDX = JSONUtil.SerializeJSON(var=QueryData, serializeQueryByColumns=true, strictMapping=true); 
JSON_Array = JSONUtil.SerializeJSON(var=QueryData, serializeQueryByColumns=false, strictMapping=true); 
</cfscript> 
+0

我從來沒有嘗試過,現在讓我試試看,希望這有助於。謝謝 – Ren44

+0

當我試圖用這個,我得到這個錯誤:' DeserializeJSON函數的JSONVAR參數是必需的,但沒有通過' – Ren44

+0

對不起....我更新了DeserializeJSON()語法。請現在試試。 –

0

也許你可以嘗試序列化coldfusion到一個字符串,然後將其傳遞給函數。然後,轉換的字符串返回JS JSON與parse()

<cfset jsonURL = SerializeJSON(SmartGuideSearchRet,true)> 
<script> 
<cfoutput> 
var #toScript(jsonURL,"jsonURL")#; 
</cfoutput> 
function parseCFJSON(json) { 

var result = [], 
    data = json.parse(); 

for (var j = 0; j < data.DATA.length; j++) { 
    result[j] = {}; 
    for (var i = 0; i < data.COLUMNS.length; i++) { 
    result[j][data.COLUMNS[i].toLowerCase()] = data.DATA[j][i]; 
    } 
} 

return result; 
}; 
parsedJSON = parseCFJSON(ujsonURL); 
console.log(parsedJSON); 
</script> 
+0

我試過了,我仍然得到'不能讀取屬性長度未定義' – Ren44

+0

console.log(數據)設置數據後返回一個對象? – Esten

0

好吧,我想通了,發生了什麼事情錯在這裏。

This <cfoutput> var #toScript(jsonURL,"jsonURL")#; </cfoutput> 解析不正確。我將其更改爲eval(),以便更新的腳本看起來像這樣並完美返回。

<script> 
mydata = eval(<cfoutput>#jsonURL#</cfoutput>) 
<cfoutput> 
</cfoutput> 
Object.prototype.parseCFJSON = function() { 

var result = [], 
    data = this; 

for (var j = 0; j < data.DATA.length; j++) { 
    result[j] = {}; 
    for (var i = 0; i < data.COLUMNS.length; i++) { 
    result[j][data.COLUMNS[i].toLowerCase()] = data.DATA[j][i]; 
    } 
} 

return result; 
}; 
mydata = mydata.parseCFJSON(); 
console.log(mydata); 
alert(mydata); 
</script> 
相關問題