2016-09-23 1 views
1

Я пытаюсь разобрать данные Coldfusion JSON, чтобы сделать его "нормальный" ColdFusion:Синтаксического Coldfusion JSON с помощью функции яваскрипта - неперехваченный ReferenceError: WddxRecordset не определен

JSON

{"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

@ Когда я пытаюсь перейти к нему, я получаю эти ошибки. – Ren44

+0

что я говорю, это если вы помещаете 'console.log (this)' перед условием 'for', где это ошибки. В основном это говорит о том, что он не может найти значение для 'data.DATA', поэтому мне любопытно, что значение' this' равно – Esten

ответ

0

Передача «struct» вашей функции serializeJson также работала для меня.

SerializeJSON (var, "struct");

1

Вы считали преобразование данных ColdFusion JSON обратно в объект ColdFusion Query, а затем преобразование его обратно в json с помощью JSONUtil?

JSONUtil имеет улучшенную поддержку JSON для CF7-2016 с "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

Когда я попытался использовать это, я получаю эту ошибку: ' Параметр JSONVAR для функции DeserializeJSON требуется, но не был передан в' – 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

Я пробовал это, и я до сих пор получаю' Can not read property 'length' undefined' – Ren44

+0

does console.log (data) возвращает объект после установки данных ? – Esten

0

Ну, я понял, что происходит здесь не так.

<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>