JSON轉換異常——SyntaxError: Unexpected token n in JSON at position 1 如何處理
阿新 • • 發佈:2020-10-29
如題,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感興趣的可以詳細研究瞭解下。