求JSON合法但YAML 1.2不合法的示例(Python验证场景)
YAML 1.2 并非 JSON 超集的反例
以下是几个能被 Python 的 json.loads() 正常解析,但 yaml.safe_loads() 会抛出错误的示例:
1. 包含重复键的对象
JSON 允许对象中存在重复键,解析时会保留最后一个键值对;但 YAML 1.2 的安全加载会直接报错。
示例代码:
import json import yaml # 可被 json.loads 正常解析 json_data = '{"key": 1, "key": 2}' print(json.loads(json_data)) # 输出: {'key': 2} # yaml.safe_loads 会抛出重复键错误 try: yaml.safe_load(json_data) except yaml.YAMLError as e: print(f"YAML 解析错误: {e}") # 抛出 DuplicateKeyError
2. 包含空字符的字符串
JSON 允许字符串中包含空字符(\u0000),但 YAML 安全加载会将其视为非法字符。
示例代码:
import json import yaml # 可被 json.loads 正常解析 json_data = '{"str": "hello\\u0000world"}' result = json.loads(json_data) print(result["str"]) # 输出包含空字符的字符串 # yaml.safe_loads 会抛出扫描错误 try: yaml.safe_load(json_data) except yaml.YAMLError as e: print(f"YAML 解析错误: {e}") # 抛出 ScannerError
3. 末尾带小数点的数字
JSON 允许数字以小数点结尾(比如 123.),但 YAML 1.2 的安全加载会将其视为无效数字格式。
示例代码:
import json import yaml # 可被 json.loads 正常解析 json_data = '{"num": 123.}' print(json.loads(json_data)) # 输出: {'num': 123.0} # yaml.safe_loads 会抛出扫描错误 try: yaml.safe_load(json_data) except yaml.YAMLError as e: print(f"YAML 解析错误: {e}") # 抛出 ScannerError
内容的提问来源于stack exchange,提问作者zephyr Victor
相关产品推荐
相关产品推荐

