跳到主要内容

数据交换格式

JSON

JSON 语法

// 字符串, 数值, 布尔值, null 为简单值
"Hello world!" // JSON 字符串必须使用双引号
// 数组
[25, "hi", true]

// 同级不能存在相同属性
// JSON 属性名必须使用双引号
// 除最后一个属性, 每个属性后必须有逗号
{
"name": "Nicholas",
"age": 29,
"school": {
"name": "Merrimack College",
"location": "North Andover, MA"
}
}

JSON API

  • JSON.stringify(value: any, replacer?: (key: string, value: any) => any | void, space?: string | number): string 静态方法: 将 JavaScript 值转换为 JSON 字符串
  • JSON.parse(text: string, reviver?: (key: string, value: any) => any): any 静态方法: 将 JSON 字符串解析为 JavaScript 值
  • JSON.isNaN(value: any): boolean 静态方法: 判断给定值是否为 NaN(比全局 isNaN 更可靠)
  • JSON.valueOf(): JSON 静态方法: 返回 JSON 对象本身

解析和序列化

// stringify() 和 parse() 连用常用于深拷贝
let jsonText = JSON.stringify(book);
let bookCopy = JSON.parse(jsonText);

序列化选项

  • 若第二个参数为数组, 值序列化数组对应属性;
  • 若第二个参数为函数, 具有 key 和 value 两个参数;
let book = {
title: "Professional JavaScript",
authors: ["Nicholas C. Zakas", "Matt Frisbie"],
edition: 4,
year: 2017,
};
//
let jsonText = JSON.stringify(book, ["title", "edition"]); // 只序列化 title 和 edition 属性
let jsonText = JSON.stringify(book, (key, value) => {
switch (key) {
case "authors":
return value.join(",");
case "year":
return 5000;
case "edition":
return undefined; // 返回 undefined 导致该属性被忽略
default:
return value;
}
});
字符串缩进
  • stringify() 第三个参数控制缩进;
let book = {
title: "Professional JavaScript",
authors: ["Nicholas C. Zakas", "Matt Frisbie"],
edition: 4,
year: 2017,
};
let jsonText = JSON.stringify(book, null, 4); // 缩进四个空格
let jsonText = JSON.stringify(book, null, "--"); // 使用 -- 代替空格
toJSON()
  • 使用 toJSON 自定义返回结果;
let book = {
title: "Professional JavaScript",
authors: ["Nicholas C. Zakas", "Matt Frisbie"],
edition: 4,
year: 2017,
toJSON: function () {
return this.title;
},
};
let jsonText = JSON.stringify(book); // 返回 "Professional JavaScript" 字符串

解析选项

let book = {
title: "Professional JavaScript",
authors: ["Nicholas C. Zakas", "Matt Frisbie"],
edition: 4,
year: 2017,
releaseDate: new Date(2017, 11, 1),
};
let jsonText = JSON.stringify(book);
let bookCopy = JSON.parse(jsonText, (key, value) =>
key == "releaseDate" ? new Date(value) : value,
);
alert(bookCopy.releaseDate.getFullYear());

XML

XML 语法

文档结构
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML 文档声明, version 属性是必需的 -->
<root>
<element attribute="value">文本内容</element>
<element>
<child>嵌套子元素</child>
</element>
<self-closing />
<empty></empty>
</root>
命名空间
<root xmlns:ns="http://example.com/ns">
<ns:element>带有命名空间前缀的元素</ns:element>
</root>
CDATA 和注释
<data>
<![CDATA[这里的内容不会被解析, 适用于包含 < > 等特殊字符]]>
<!-- 这是 XML 注释 -->
</data>

JavaScript API

  • DOMParser.parseFromString(string: string, mimeType: string): Document 构造方法: 将字符串解析为 DOM 文档, mimeType 可为 "application/xml", "text/xml", "image/svg+xml", "text/html"
  • XMLSerializer.serializeToString(node: Node): string 实例方法: 将 DOM 节点序列化为 XML 字符串