Wednesday, February 28, 2007

JSON, Object Literal 傻傻分不清楚

Foundations of AjaxAjax in Action 都沒把 JavaScript 中以大括號宣告物件的方式(稱作 Object Initializer 或 Object Literal)和 JSON 講正確,都把 Object Literal 講成是 JSON

Foundations of Ajax 是在 68、69 頁之間有點小誤導,Ajax in Action 則是在 B.2.1 完全講錯,還說 JSON 是 JavaScript 的核心特性(The JavaScript Object Notation (JSON) is a core feature of the language.)

Object Literal 才是 JavaScript 核心特性,JSON 是學 Object Literal 的部分語法而成的,一個資料交換的文字格式

所以絕對不可以說在 JavaScript 中以大括號選告物件是 JSON,它是 Object Literal,例如

var cat = {
name: "Kitty",
miaow: function() { return "喵喵喵" }
};

// 這是 Object Literal,不是 JSON
// 這是 Object Literal,不是 JSON
// 這是 Object Literal,不是 JSON

Object Literal 屬性名稱可以不加引號,但 JSON 中那裡得是一個字串,一定要加引號,而且 JSON 不支援函式,所以:

// 把上面 object literal 屬性加上引號當成字串
var s = '{"name": "Kitty", "miaow": function() { return "喵喵喵" }}';

// 用 JSON 的 JavaScript library 去 parse 回 JavaScript 物件
var o = s.parseJSON();

// 這是 parse 不出來的,因為 JSON 不支援函式
// JSON library 會丟出 parseJSON 的 error - throw new SyntaxError("parseJSON");

將 cat 物件用 JSON 的 JavaScript library 輸出 JSON 字串,也不會包含函式部分

cat.toJSONString()
// '{"name":"Kitty"}'

雖然字串 s 如果用 eval 可以成功變回 object

var o = eval('(' + s + ')');
o.name
// "Kitty"

o.miaow()
// "喵喵喵"

不過這是因為 eval 接受的是 JavaScript,s 是一個合法的 Object Literal 所以 eval 接受,但 s 不是一個合法的 JSON

JSON 格式是 Object Literal 的子集,所以合法 JSON 資料,eval 一定接受,反過來則不一定,合法的 Object Literal 不見得符合 JSON 格式


  • 留言者: 小笨笨
  • Email: pbird123@secureix.com
  • 網址:
  • 日期: 2007-05-09 00:59:36
「JSON is a subset of the object literal notation of JavaScript」!?

有時候看了wikipedia上面的說明,會讓人困惑

No comments:

Post a Comment