JSON 是 JavaScript 原生格式,這表示 在 JavaScript 中處理 JSON 資料不需要任何特殊的 API 或工具包。
JSON語法
JSON建構於兩種結構:
物件——名稱/值對的集合。不同的語言中,它被理解為對象,紀錄,結構,字典,哈希表,有鍵列表(keyed list),或關聯數組。一個物件以「{」(左括號)開始,「}」(右括號)結束。每個「名稱」後面跟著一個「:」(冒號);「『名稱/值' 對」之間使用「,」(逗號)分隔。
數組——值的有序列表。在大部分語言中,它被理解為數組。一個陣列以「[」(左中括號)開始,「]」(右中括號)結束。值之間使用“,”(逗號)分隔。
JSON沒有變數或其他控制結構。 JSON只用於資料傳輸。
將JSON 資料賦值給變數
例如,可以建立一個新的 JavaScript 變量,然後將 JSON 格式的資料字串直接賦值給它:
var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" }, { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" }, { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" } ], "authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" }, { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" }, { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" } ], "musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" }, { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" } ] }
這非常簡單;現在 people 包含前面看到的 JSON 格式的資料。但是,這還不夠,因為存取資料的方式似乎還不明顯。
存取資料
儘管看起來不明顯,但是上面的長字串其實只是一個陣列;將這個陣列放進 JavaScript 變數之後,就可以很輕鬆地存取它。實際上,只需用點號表示法來表示陣列元素。所以,要存取 programmers 清單的第一個條目的姓氏,只需在 JavaScript 中使用下面這樣的程式碼:
people.programmers[0].lastName;
注意,陣列索引是從零開始的。所以,這行程式碼首先存取 people 變數中的資料;然後移動到稱為 programmers 的條目,再移動到第一個記錄( [0] );最後,存取 lastName 鍵的值。結果是字串值 “McLaughlin” 。
以下是幾個使用相同變數的範例。
people.authors[1].genre // Value is "fantasy" people.musicians[3].lastName // Undefined. This refers to the fourth entry,and there isn't one people.programmers[2].firstName // Value is "Elliotte"
利用這樣的語法,可以處理任何 JSON 格式的數據,而不需要使用任何額外的 JavaScript 工具包或 API 。
修改 JSON 資料
如同可以用點號和括號存取數據,也可以用相同的方式輕鬆修改資料:
people.musicians[1].lastName = "Rachmaninov";
在將字串轉換為 JavaScript json 格式物件之後,就可以像這樣修改變數中的資料。
注意:json 格式的物件和 json 文字是不同的
var obj={name:" 张三 ","sex":' 男 '}; //json 格式的对象 var str=" { name: " 张三 " , "sex" : ' 男 ' }" ; //json 格式的字符串( json 格式的文本)
轉換回字串
當然,如果不能輕鬆地將物件轉換回本文提到的文字格式,那麼所有資料修改都沒有太大的價值。在 JavaScript 中這種轉換也很簡單:
var newJSONtext = people.toJSONString();
這樣就行了!現在就獲得了一個可以在任何地方使用的文字字串,例如,可以將它用作 Ajax 應用程式中的請求字串。
更重要的是,可以將任何 JavaScript 物件轉換為 JSON 文字。並非只能處理原先用 JSON 字串賦值的變數。為了對名為 myObject 的物件進行轉換,只需執行相同形式的命令:
<script type="text/javascript"> function Car(make,model,year,color) { this.make=make; this.model=model; this.year=year; this.color=color; } function showCar() { var carr = new Car("Dodge","Coronet R/T",1968,"yellow"); alert(carr.toJSONString()); } </script>
這就是 JSON 與其他資料格式之間最大的差異。如果使用 JSON ,只需呼叫一個簡單的函數,就可以獲得經過格式化的數據,可以直接使用了。對於其他資料格式,需要在原始資料和格式化資料之間進行轉換。即使使用 Document Object Model 這樣的 API (提供了將自己的資料結構轉換為文字的函數),也需要學習這個 API 並使用 API 的對象,而不是使用原生的 JavaScript 物件和語法。
最終結論是,如果要處理大量 JavaScript 對象,那麼 JSON 幾乎肯定是一個好選擇,這樣就可以輕鬆地將資料轉換為可以在請求中發送給伺服器端程式的格式(Ajax) 。
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()函數處理後會有問題(拋出語法異常) 。