2012-10-01 108 views
1

我能夠解析JSON,但返回簡單的數據,與JSON.parse我有一個返回的對象,日期,字符串等數據的麻煩..解析複雜的JSON的JavaScript

var theData=JSON.parse(theData); 

像這樣的東西JSON.parse返回[Object]對象,根本沒有數據(我可以看到數據正在成功返回,因爲如果關閉了JSON.parse,它會將所有數據作爲字符串返回)。

{"AppName":"TheName","AppUrl":"https:\/\/app\/icons\/unknown.png","aGUID":"45c055d2-2edc-d4444"."DateCreated":"8\/23\/2012 11:04AM", {"ID":"yser123",Name":"User"}} 

什麼是最好的方式去解析JavaScript中的數據(我不能使用jQuery)?

注:我已經寫了JSON承擔其有效

這裏是我使用中檢索數據的代碼..

var xhReq = new XMLHttpRequest(); 
xhReq.open("POST", "ClientService.svc/REST/GetDetail", false); 
xhReq.send(null); 
var serverResponse = xhReq.responseText; 
alert(serverResponse); 
return serverResponse; 
+2

您發佈的特定字符串是無效的JSON。最後還有一個缺失的字符,否則'JSON.parse()'會處理任何東西(這是有效的JSON)。 – Pointy

+0

你爲什麼要「/」? – davidbuzatto

+0

@david這就是它返回的方式 –

回答

1

首先,don't use synchronous XHR。重寫你的JavaScript是異步的。

function getDetail(cb) { 
    var xhReq = new XMLHttpRequest(); 
    xhReq.open("POST", "ClientService.svc/REST/GetDetail", true); 
    xhReq.onreadystatechange = function() { 
     if (xhReq.readyState == 4) cb(xhReq.responseText); 
    } 
    xhReq.send(null); 
} 

// to call: 

getDetail(function(data) { 
    JSON.parse(data); 
} 

其次,您的問題不是JSON解析不正確。這是您撥打alert的調試電話。當您通過serverResponse對象時,alert通過調用對象的toString方法將對象強制轉換爲字符串,該方法僅返回'[object Object]'

嘗試console.log。對象可以在控制檯中檢查。

+0

哇,肯定會通過很多噪音:-) – Pointy

+0

爲什麼不能使用同步XHR? –

+0

@NickLaMarca:通常,同步XHR是一個主要的禁忌。有詳細信息[here](http://blogs.msdn.com/b/wer/archive/2011/08/03/why-you-should-use-xmlhttprequest-asynchronously.aspx)和[here](https:/ /developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest/Synchronous_and_Asynchronous_Requests),但最重要的是,[同步XHR正在被淘汰](http://updates.html5rocks.com/2012/01/Getting-Rid -of-同步-XHR時)。 – josh3736

0

你的JSON格式錯誤和數據必須是一個串。

所以,這將工作(我打破了以提高可讀性線):

var data = "{" + 
    " \"AppName\": \"TheName\", " + 
    " \"AppUrl\": \"https:\/\/app\/icons\/unknown.png\", " + 
    " \"aGUID\": \"45c055d2-2edc-d4444\", " + 
    " \"DateCreated\": \"8\/23\/2012 11:04AM\", " + 
    " \"foo\": { " + 
    "  \"ID\": \"yser123\", " + 
    "  \"Name\":\"User\"" + 
    " }" + 
    "}"; 
var obj = JSON.parse(data); 
alert(obj.AppName); 

當然,如果你使用簡單的報價爲字符串分隔符,代碼將是:

var data = '{' + 
    ' "AppName": "TheName", ' + 
    ' "AppUrl": "https:\/\/app\/icons\/unknown.png", ' + 
    ' "aGUID": "45c055d2-2edc-d4444", ' + 
    ' "DateCreated": "8\/23\/2012 11:04AM", ' + 
    ' "foo": { ' + 
    '  "ID": "yser123", ' + 
    '  "Name":"User"' + 
    ' }' + 
    '}'; 

不工作

var data = "{" + 
    " 'AppName': 'TheName', " + 
    " 'AppUrl': 'https:\/\/app\/icons\/unknown.png', " + 
    " 'aGUID': '45c055d2-2edc-d4444', " + 
    " 'DateCreated': '8\/23\/2012 11:04AM', " + 
    " 'foo': { " + 
    "  'ID': 'yser123', " + 
    "  'Name': 'User'" + 
    " }" + 
    "}"; 

的jsfiddle:http://jsfiddle.net/9pmdm/1/

+1

爲什麼你可以用_single_引號括住雙引號? – Alnitak

+0

我擁有的JSON是由C#從實際的.Net對象創建的,我沒有控制創建的JSON。我提出的JSON示例可能無效(可能缺少引號),因爲我手寫它用於示例目的。是否有可能.Net也許搞砸了返回的JSON? –

+0

應該引用正斜槓,但我同意這似乎沒有必要。我認爲'JSON.parse()'不會堅持它,但它絕對有效。 – Pointy

1

它實際上聽起來像這是工作。如果你打電話這樣:

alert(JSON.parse(serverResponse)) 

它會顯示[對象對象]這是正確的。如果您致電

alert(JSON.parse(serverResponse).appName) 

您應該看到appName。如果您沒有看到「SyntaxError」正在拋出,JSON.parse()正在工作