JSON是一種便於操作使用的輕量級資料交換格式。易於人閱讀和編寫。同時也易於機器解析和產生。
很多時候我們需要組裝字串為json對象,首先要組合字元串,然後轉換為json對象,如下面的例子:
<script type="text/javascript"> <!-- var a=50,b="xxx"; var arr="{id:"+a+",name:'"+b+"'}"; //--></script>
組合成了字串arr,下一步就是轉換成對象了,很快我們會想到使用eval方法,但如果這樣做轉換會出現錯誤,今日偶就這樣嘗試了,那該如何轉換成json對象呢?鬱悶許久,之後在json官網提供的json.js檔案中找到瞭解決辦法,方法如下:
在字串兩端再加上括弧然後eval就ok了。測試代碼如下:
<script type="text/javascript"> <!-- var a=50,b="xxx"; var arr="{id:"+a+",name:'"+b+"'}"; arr=eval('('+arr+')') alert(arr.name); //--></script>
上面代碼執行後會彈出“xxx”,說明已經成功轉換為json對象了,一個似乎很簡單的問題,不過還是鬱悶了半天才解決掉,還是記到blog上以加深印象,也希望能協助遇到此問題的朋友早日解除鬱悶。
下面是一個詳細的運用例子:
<html><head><title>AjaxTest</title><script type="text/javascript">var xmlHttp;function createXMLHttpRequest(){ if(window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if(window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); }}function startRequest(){ createXMLHttpRequest(); try { xmlHttp.onreadystatechange = handleStateChange; xmlHttp.open("GET", "json.txt", true); xmlHttp.send(null); } catch(exception) { alert("xmlHttp Fail"); }}function handleStateChange(){ if(xmlHttp.readyState == 4) { if (xmlHttp.status == 200 || xmlHttp.status == 0) { var result = xmlHttp.responseText; var json = eval("(" + result + ")"); alert(json.user); alert(json.sex); } }}</script></head><body> <div> <input type="button" value="AjaxTest" onclick="startRequest();" /> </div></body></html>
其中json.txt為:
{"user":"cck","sex":"name"}
使用ajax的開發項目過程中,經常需要將json格式的字串返回到前端,前端解析成js對象(JSON )。ECMA-262(E3) 中沒有將JSON概念寫到標準中,還好在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全域的JSON對象和Date的toJSON方法。
1. eval方式解析,恐怕這是最早的解析方式了。如下:
function strToJson(str){ var json = eval('(' + str + ')'); return json;}
記得別忘了str兩旁的小括弧。
2. new Function形式,比較怪異哦。如下
function strToJson(str){ var json = (new Function("return " + str))(); return json;}
3. 使用全域的JSON對象,如下:
function strToJson(str){ return JSON.parse(str);}
目前 IE8/Firefox3.5+/Chrome4/Safari4/Opera10 已實現了該方法。
有時從資料庫讀出來的資料帶有空格,使 eval 失效。這時只要將字串中的空格去掉即可。
var result = xmlhttp.responseText;text = result.replace(/\s/ig, ' ');var json = eval('(' + text + ')');gen3_title.innerHTML = json.title;gen3.innerHTML = json.content;