這個問題在之前做項目時碰到過一次,當時按照網上的做法,去掉JSON.parse()這一層轉換后就沒有這個報錯了,數據也能正常使用,就沒多想,也沒深究是什么原因。可是這次又碰到了,所以這次我必須要弄明白原因。
先看看它的作用
JSON.parse()用於從一個字符串中解析出json對象,如
var str = '{"name":"LeonWu","age":"18"}'
JSON.parse(str);
//結果為一個Object
// age: "18";
// name: "LeonWu";
1
2
3
4
5
6
7
JSON.stringify()用於從一個對象解析出字符串,如
var a = {a:1,b:2,c:"LeonWu"};
JSON.stringify(a);
//結果為 "{"a":1,"b":2,"c":"LeonWu"}"
1
2
3
4
5
6
背后的原因
報錯的原因:
因為你要轉換的數據本來就是object,這個方法是把一個字符串解析出json對象,你再轉換就會報錯;
為什么會有這樣的錯誤:
因為把Object作為參數傳到JSON.parse()里時,它會默把Object轉為string,
就會先調用原型上的toString()方法;結果為”[object Object]”,JSON.parse將第一個字符’[‘理解為數組的開始,第二字符’o’不知道怎么處理;所以就拋出了上面的錯誤信息 Unexpected token o in JSON at position 1。
---------------------
JSON字符串:
var str1 = '{ "name": "cxh", "sex": "man" }';
JSON對象:
var str2 = { "name": "cxh", "sex": "man" };
一、JSON字符串轉換為JSON對象
要使用上面的str1,必須使用下面的方法先轉化為JSON對象:
//由JSON字符串轉換為JSON對象
var obj = eval('(' + str + ')');
或者
var obj = str.parseJSON(); //由JSON字符串轉換為JSON對象
或者
var obj = JSON.parse(str); //由JSON字符串轉換為JSON對象
然后,就可以這樣讀取:
Alert(obj.name);
Alert(obj.sex);
特別注意:如果obj本來就是一個JSON對象,那么使用eval()函數轉換后(哪怕是多次轉換)還是JSON對象,但是使用parseJSON()函數處理后會有問題(拋出語法異常)。
二、可以使用toJSONString()或者全局方法JSON.stringify()將JSON對象轉化為JSON字符串。
例如:
var last=obj.toJSONString(); //將JSON對象轉化為JSON字符
或者
var last=JSON.stringify(obj); //將JSON對象轉化為JSON字符
在使用JSON.parse的時候,返回來的數據一定是嚴格的json格式,key值一定要用 雙引號 包起來,否則瀏覽器就會拋出異常。
另外,對於不標准的json字符串,如第一種示例,使用eval()雖然可以正常解析,但是從安全的角度來講,一定要謹慎使用eval方法。規范json格式。
參考:https://blog.csdn.net/wxl1555/article/details/79184076