⌨️ 第六章 Web技术与安全
📄 本篇一句话

数据要在系统之间搬家,就得有大家都认的行李格式——CSV 一行一条最朴素,XML 标签最隆重,JSON 是 Web 的事实标准,YAML 专管配置文件。

📝 在本章的位置

上游:3-9/3-10 的字符编码(所有格式底层都是文本+编码);6-7 的 Ajax 拿回来的数据多半是 JSON。下游:6-10 的 SQL 是数据的另一种「格式」(表);6-15 的 API 返回的多半是 JSON。

一、CSV:逗号分隔的表格

CSV(Comma-Separated Values)=每行一条记录、逗号分列:

name,score
波仔,88
小红,92

二、XML:标签套标签的隆重格式

XML(eXtensible Markup Language)=自定义标签的树形格式:

<student>
  <name>波仔</name>
  <score>88</score>
</student>

三、JSON:Web 的事实标准

JSON(JavaScript Object Notation)——长得像 JS 对象字面量:

{"name": "波仔", "scores": [88, 92], "pass": true}

四、YAML:写给人看的配置

YAML(YAML Ain't Markup Language)=缩进表达层次、最少标点:

student:
  name: 波仔
  scores: [88, 92]
  pass: true

动手 Demo:同一份数据,四种格式互转

import json, csv, io

data = [{"name": "波仔", "scores": [88, 92], "pass": True},
        {"name": "小红", "scores": [95, 89], "pass": True}]

# JSON:一行搬走
s = json.dumps(data, ensure_ascii=False)
print(s[:50], "...")
print("JSON 还原:", json.loads(s) == data)          # True —— 无损往返

# CSV:二维平表(嵌套结构装不下,只能拍平)
buf = io.StringIO()
w = csv.writer(buf)
w.writerow(["name", "score"])
for d in data:
    for sc in d["scores"]:
        w.writerow([d["name"], sc])
print("CSV 形态:")
print(buf.getvalue(), end="")
# YAML:手写最舒服(无 pyyaml 时直接读文本)
yaml_text = """student:
  name: 波仔
  scores: [88, 92]"""
print(yaml_text)

看到什么算成功:JSON 原样还原(True)、CSV 拍平成四行、YAML 缩进成树——同一份数据,四种行李箱,按用途挑。

读结果:能无损往返的 JSON 适合机器交换;拍平的 CSV 适合 Excel;人手写的配置选 YAML;老系统对接才见 XML。

30 秒实验

F12 控制台跑 JSON.stringify({b:2,a:1})——得 '{"b":2,"a":1}'(保持键序);再跑 JSON.parse('{"n":1,}')——报错(JSON 不许尾逗号)。感受一下:JS 对象字面量宽松,JSON 是 stricter 子集。

常见误区

自测三问(点击展开) 1. **四种格式各选什么场景?** 答:表格交换 CSV、机器间数据交换 JSON、人写配置 YAML、老系统/强校验 XML。 2. **JSON 比 XML 流行的原因?** 答:更轻、JS 原生解析、类型够用;XML 啰嗦但校验与命名空间更强。 3. **YAML 最大的坑?** 答:缩进即结构,错一格含义就变;另有类型魔法(no→false)。

相关笔记