All Tools / Blog / 如何在线格式化和验证JSON

如何在线格式化和验证JSON

2 min read

压缩的JSON难以阅读。来自API响应或配置文件的单行数据块,不先格式化根本无法调试。以下是如何快速格式化JSON、验证并修复让解析器崩溃的常见错误。

JSON格式化做什么

格式化(也叫美化输出)将这个:

{"name":"John Doe","age":30,"address":{"city":"New York","zip":"10001"},"tags":["developer","writer"]}

变成这个:

{
  "name": "John Doe",
  "age": 30,
  "address": {
    "city": "New York",
    "zip": "10001"
  },
  "tags": [
    "developer",
    "writer"
  ]
}

数据相同,只是空白不同——两种形式的JSON都有效。

在浏览器中格式化

将压缩的JSON粘贴到格式化工具,点击格式化,获得缩进输出。大多数格式化工具也会在输入时验证,精确高亮语法错误所在的行。这是一次性调试的最快方式。

在JavaScript中格式化

const minified = '{"name":"John Doe","age":30}';
const formatted = JSON.stringify(JSON.parse(minified), null, 2);
console.log(formatted);

JSON.stringify(value, replacer, space) — 第三个参数是缩进量。2 表示2个空格;'\t' 表示制表符。

在Node.js中格式化JSON文件:

const fs = require('fs');
const data = JSON.parse(fs.readFileSync('data.json', 'utf8'));
fs.writeFileSync('data.json', JSON.stringify(data, null, 2));

在Python中格式化

import json

minified = '{"name": "John Doe", "age": 30}'
formatted = json.dumps(json.loads(minified), indent=2)
print(formatted)

原地格式化文件:

import json

with open('data.json', 'r') as f:
    data = json.load(f)

with open('data.json', 'w') as f:
    json.dump(data, f, indent=2, ensure_ascii=False)

ensure_ascii=False 保留Unicode字符(é、ñ、你好),而不是将其转义为\uXXXX

命令行:jq

jq 是命令行JSON处理器。格式化文件:

# 安装
brew install jq        # macOS
sudo apt install jq    # Ubuntu

# 美化输出
jq . data.json

# 压缩
jq -c . data.json

# 格式化管道传入的API响应
curl -s https://api.example.com/data | jq .

Python一行代码(无需安装):

python3 -m json.tool data.json

常见JSON错误及修复方法

尾随逗号:

{
  "name": "John",
  "age": 30,    ← 错误
}

JSON不允许尾随逗号。删除 }] 前的最后一个逗号。

单引号代替双引号:

{'name': 'John'}   ← 错误

JSON要求所有字符串和键使用双引号。将 ' 替换为 "

未加引号的键:

{name: "John"}   ← 错误

JavaScript对象字面量语法在JSON中无效。键必须加引号:{"name": "John"}

注释:

{
  // 这是用户对象
  "name": "John"
}

JSON不支持注释。删除它们,或者如果工具支持,切换到JSONC(带注释的JSON)格式。

undefined或NaN值:

{"value": undefined}   ← 错误
{"value": NaN}         ← 错误

undefinedNaNInfinity是JavaScript值,不是JSON值。用null0替换,或删除该字段。

字符串中未转义的特殊字符:

{"message": "He said "hello""}   ← 错误

字符串内的双引号必须转义:{"message": "He said \"hello\""}

字符串中的换行符也需要转义:用\n而非字面换行符。

程序化验证

function isValidJson(str) {
    try {
        JSON.parse(str);
        return true;
    } catch {
        return false;
    }
}
import json

def is_valid_json(s: str) -> bool:
    try:
        json.loads(s)
        return True
    except json.JSONDecodeError:
        return False

在生产环境中,JSON.parse(JS)和json.loads(Python)都会抛出带有错误位置的异常。

键排序

按字母顺序排序的键使版本控制中的差异比较更清晰:

const sorted = JSON.stringify(data, Object.keys(data).sort(), 2);
json.dumps(data, sort_keys=True, indent=2)

要点总结

  • JavaScript用JSON.stringify(data, null, 2),Python用json.dumps(data, indent=2)格式化任意对象。
  • jq . 是最快的命令行格式化工具——与curl输出配合使用效果很好。
  • 五种最常见的JSON错误:尾随逗号、单引号、未加引号的键、注释和未转义字符。
  • Python中用ensure_ascii=False保持Unicode可读。
  • sort_keys=True / Object.keys().sort()排序键,获得更清晰的差异。