1. 程式人生 > 實用技巧 >JSON轉換異常——SyntaxError: Unexpected token n in JSON at position 1 如何處理

JSON轉換異常——SyntaxError: Unexpected token n in JSON at position 1 如何處理

如題,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感興趣的可以詳細研究瞭解下。