如題,JSON字符串轉換JSON格式報錯:
這個問題,一般在JSON字符串轉換JSON對象的時候才會出現的,下面就詳細介紹下。
為什么會出現這個問題?
對於JSON來說,主要由兩種格式,一種是對象,另一種是數組,如下:
//JSON 對象 var jsonObj={ "name":"json", "alexa":10000, "site":null } //JSON 數組 var jsonArr=[ "Google", "Runoob", "Taobao" ] //亦或者 var jsonArr=[ { "name":"json", "alexa":10000, "site":null },{ "name":"json", "alexa":10000, "site":null } ]
這么看,跟 javascript的對象和數組並沒有什么區別。但是有一點需要注意的是,JSON中對象的key值是必須要有引號的(js對象的key是不需要引號的,雖然也能兼容帶引號的寫法)。
那么,再來看下JSON.parse的用法:
JSON.parse(text[, reviver])
其中:
- text:必需, 一個有效的 JSON 字符串;
- reviver: 可選,一個轉換結果的函數, 將為對象的每個成員調用此函數。
如上,JSON.parse()函數接收的是有效的JSON字符串,如這樣:
//正確用法示例 var jsonStr = '{"name":"jsonStr", "type":"str"}' var jsonObj = JSON.parse(jsonStr) //輸出 { "name":"runoob", "alexa":10000, "site":"www.runoob.com" }
那么,普通js對象格式的字符串呢?
//正確用法示例 var objStr = '{name:"objStr", type":str"}' var jsonObj = JSON.parse(objStr) //SyntaxError: Unexpected token n in JSON at position 1
如上,由於JSON.parse()接收了無效的JSON字符串,導致報錯。
那么如何解決這個問題呢?
JSON通常被用來與服務器端交換數據,接收服務器數據時一般是字符串,由前端將JSON數據線轉換為JSON數據。
如果后端返回的字符串數據中是無效的JSON字符串(key無引號),那么就無法使用JSON.parse()來進行數據轉換了。
對於非有效JSON字符串,可以使用JS的eval()函數進行轉換:
var str = '{name:"小明",age:18}'; var json = eval("("+str+")")
除了字符串格式,還有些后端開發會直接返回xml格式數據給到前端,也可能會出現這個問題。如果是這樣也只有使用eval()函數了。
當然,這是在明確數據源的情況下使用eval(),eval也並不是能那么隨意的使用的。eval也存在一個安全問題,就是它可以執行傳給它的任何字符串,所以永遠不要傳入字符串或者來歷不明、不受信任源的參數,以免造成不可預知的后果。
對eval感興趣的可以詳細研究了解下。