2011-11-08 88 views
3

我有一些JSON已從servlet傳遞並存儲在xmlhttp.responseText中。我想分解這個JSON,以便我可以擁有數據,大小,樣式,名稱等的值。另外,我希望將小部件值設置爲單獨的變量。JavaScript中的JSON字符串解析

這裏是JSON:

{ 
    "widget vlaue=2": { 
    "debug": "on", 
    "window": { 
     "title": "Sample Konfabulator Widget", 
     "name": "main_window", 
     "width": 500, 
     "height": 500 
    }, 
    }, 
    "image": { 
    "src": "Images/Sun.png", 
    "name": "sun1", 
    "hOffset": 250, 
    "vOffset": 250, 
    "alignment": "center" 
    }, 
    "text": { 
    "data": "Click Here", 
    "size": 36, 
    "style": "bold", 
    "name": "text1", 
    "hOffset": 250, 
    "vOffset": 100, 
    "alignment": "center", 
    "onMouseUp": "sun1.opacity = (sun1.opacity/100) * 90;" 
    } 
}  

我已經試過這樣:

obj = JSON.parse(xmlhttp.responseText); 

但失敗了。我在網上找不到與它相關的任何內容。任何人都可以幫助我嗎?

+3

你是什麼意思,它「失敗」?你有沒有從瀏覽器中得到任何錯誤? –

+0

這個輸出是「undefined」 – typedefcoder2

+0

你的意思是「輸出是'未定義'這個」?什麼是'這個'和'輸出'是什麼? –

回答

7

json.org

要將JSON文本轉換成一個對象,你可以使用eval()函數 。 eval()調用JavaScript編譯器。由於JSON是JavaScript的一個合適的子集,因此編譯器將正確解析文本並生成對象結構。必須將文本包裝在 父元素中,以避免跳出JavaScript語法中的歧義。

var myObject = eval('('+ myJSONtext +')');

但是JSON.parse仍建議:

eval函數是非常快的。但是,它可以編譯並執行任何JavaScript程序,因此可能存在安全問題。當來源是可信和有效的時候指示使用 eval。使用JSON解析器更安全的多 。在通過XMLHttpRequest的Web應用程序中, 通信只允許與提供 頁面的相同源,因此它是可信的。但它可能無法勝任。如果服務器 的JSON編碼不嚴格,或者如果它沒有嚴格地驗證其所有輸入,那麼它可能會傳遞無效的JSON文本 ,這可能會攜帶危險的腳本。 eval函數 執行腳本,釋放其惡意。

爲了防禦這一點,應該使用JSON解析器。 JSON解析器 將只識別JSON文本,拒絕所有腳本。在 提供本機JSON支持的瀏覽器中,JSON解析器也比 eval快得多。預計本地JSON支持將包含在 下一個ECMAScript標準中。

var myObject = JSON.parse(myJSONtext,reviver);

也許您的JSON出了問題,請訪問jsonlint.com獲取免費的基於Web的JSON驗證程序。

+0

我的JSON已經從JSONLint驗證過。在我使用Javascript之前,我一直在做這件事。 – typedefcoder2

+0

你說這是來自一個servlet,你是​​否100%確定該字符串沒有被自動轉義或修改?我曾經使用PHP來傳遞JSON字符串,正如您所知,雙引號會將所有東西混淆,因爲它沒有在PHP中正確轉義。由於每種語言都具有不同的轉義字符,因此該servlet的預期輸出可能已更改。嘗試在服務器端打印出JSON字符串,以查看它是否完全正確,如上所述。 – Gapton

+0

那麼上面的例子就是一個類似的例子。由於保密性,我無法發佈確切的JSON。儘管我的JSON已經從JSONLint驗證過。 – typedefcoder2

5

您的JSON,您提供的是無效。第9行包含額外的,,不應該在那裏。

這是一個JSFiddle,沒有,

http://jsfiddle.net/ApDsP/

+0

好眼睛,的確我相信是錯誤的。現在我知道了我不應該100%地依賴JSON驗證器,因爲不是所有的驗證器都會檢查結尾的逗號。 (我想這是因爲並非所有的JSON庫都禁止它) – Gapton

+0

我不知道JSON OP粘貼到JSlint中,但JSON在JSlint中也沒有驗證。 – Strelok

+0

其實,我** DID **複製並粘貼他的JSON到JSONLint,我第一次這樣做,它的工作。現在我只是在5秒前再次嘗試,並且它**失敗**(當然,由於第9行中的逗號)。我認爲OP或某人編輯了他在JSONLint中首次嘗試驗證它後發佈的JSON。 – Gapton