JSON.parse()

JSON 的常规用途是同 web 服务器进行数据传输。

在从 web 服务器接收数据时,数据永远是字符串。

通过 JSON.parse() 解析数据,这些数据会成为 JavaScript 对象。

实例 – 解析 JSON

请想象一下我们从 web 服务器接收到这段文本:

  1. '{ "name":"Bill Gates", "age":62, "city":"Seattle"}'

请使用 JavaScript 函数 JSON.parse() 把文本转换为 JavaScript 对象:

  1. var obj = JSON.parse('{ "name":"Bill Gates", "age":62, "city":"Seattle"}');

请确保这段文本以 JSON 格式书写,否则会出现语法错误。

请在您的页面中使用 JavaScript 对象:

实例

  1. <p id="demo"></p>
  2.  
  3. <script>
  4. document.getElementById("demo").innerHTML = obj.name + ", " + obj.age;
  5. </script>

来自服务器的 JSON

您能够通过使用 AJAX 请求从服务器请求 JSON。

只要服务器的响应是用 JSON 格式编写的,你可以将字符串解析成 JavaScript 对象。

实例

请使用 XMLHttpRequest 从服务器获取数据:

  1. var xmlhttp = new XMLHttpRequest();
  2. xmlhttp.onreadystatechange = function() {
  3. if (this.readyState == 4 && this.status == 200) {
  4. myObj = JSON.parse(this.responseText);
  5. document.getElementById("demo").innerHTML = myObj.name;
  6. }
  7. };
  8. xmlhttp.open("GET", "json_demo.txt", true);
  9. xmlhttp.send();

json_demo.txt

  1. {
  2. name: "Bill Gates",
  3. age: 62,
  4. Cars: [
  5. {
  6. car: "porsche",
  7. model: "911"
  8. },
  9. {
  10. car: "BMW",
  11. model: "M5"
  12. },
  13. {
  14. car: "Volvo",
  15. model: "XC90"
  16. }
  17. ]
  18. }

作为 JSON 的数组

在对衍生自数组的 JSON 使用 JSON.parse() 后,此方法将返回 JavaScript 数组,而不是 JavaScript 对象。

实例

从服务器返回的 JSON 是数组:

  1. var xmlhttp = new XMLHttpRequest();
  2. xmlhttp.onreadystatechange = function() {
  3. if (this.readyState == 4 && this.status == 200) {
  4. myArr = JSON.parse(this.responseText);
  5. document.getElementById("demo").innerHTML = myArr[0];
  6. }
  7. };
  8. xmlhttp.open("GET", "json_demo_array.txt", true);
  9. xmlhttp.send();

json_demo_array.txt

  1. [
  2. "porsche",
  3. "BMW",
  4. "Volvo",
  5. "Audi"
  6. ]

例外

解析日期

JSON 中不允许日期对象。

如果您需要包含日期,请写为字符串。

之后您可以将其转换回日期对象:

实例

把字符串转换为日期:

  1. var text = '{ "name":"Bill Gates", "birth":"1955-10-28", "city":"Seattle"}';
  2. var obj = JSON.parse(text);
  3. obj.birth = new Date(obj.birth);
  4.  
  5. document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;

或者您可以已使用 JSON.parse() 函数的第二个参数,被称为 reviver

这个 reviver 参数是函数,在返回值之前,它会检查每个属性。

实例

将字符串转换为日期,使用 reviver 函数:

  1. var text = '{ "name":"Bill Gates", "birth":"1955-10-28", "city":"Seattle"}';
  2. var obj = JSON.parse(text, function (key, value) {
  3. if (key == "birth") {
  4. return new Date(value);
  5. } else {
  6. return value;
  7. }});
  8.  
  9. document.getElementById("demo").innerHTML = obj.name + ", " + obj.birth;

解析函数

JSON 中不允许函数。

如果您需要包含函数,请把它写作字符串。

稍后您可以把它转换回函数:

实例

把字符串转换为函数:

  1. var text = '{ "name":"Bill Gates", "age":"function () {return 62;}", "city":"Seattle"}';
  2. var obj = JSON.parse(text);
  3. obj.age = eval("(" + obj.age + ")");
  4.  
  5. document.getElementById("demo").innerHTML = obj.name + ", " + obj.age();

您应该避免在 JSON 中使用函数,函数会丢失它们的作用域,而且您还需要使用 eval() 把它们转换回函数。

浏览器支持

所有主流浏览器以及最新的 ECMAScript (JavaScript) 标准均包含 JSON.parse() 函数:

下表中的数字指定了完全支持 JSON.parse() 函数的首个浏览器版本:

Yes 8.0 3.5 4.0 10.0

对于更老的浏览器,以下地址中的 JavaScript 库是可用的:

https://github.com/douglascrockford/JSON-js