如何读取加了格式的JSON文件
在数据交互与存储中,JSON(JavaScript Object Notation)因其轻量级、易读性强的特点被广泛应用,但实际场景中,JSON文件可能并非“纯原始数据”,而是包含特定格式信息——例如带有注释、缩进美化、多行文本、自定义分隔符,甚至是与其他格式(如YAML、XML)混合的“伪JSON”结构,这类“加了格式的JSON文件”直接用标准JSON解析器读取往往会报错,需结合格式特点采用针对性方法,本文将常见“格式化JSON”分为三类,详细说明其读取方法。
什么是“加了格式的JSON文件”?
标准JSON要求严格:数据必须是键值对(对象)或值列表(数组),字符串必须用双引号,不能包含注释,且通常无多余空格(尽管允许空白符),但实际开发中,为提升可读性或适配特定工具,JSON文件常被“格式化”,常见形式包括:
- 带注释的JSON:添加单行()或多行()注释,说明字段含义;
- 美化格式(Pretty-Printed JSON):通过缩进(如2空格、4空格)、换行提升可读性,例如
{ "name": "张三", "age": 18 }而非{"name":"张三","age":18}; - 多行文本或特殊分隔符:字段值包含换行符、制表符,或使用非标准引号(如单引号);
- 伪JSON(如JSON with Comments):部分场景(如
.jsonc文件)允许注释,本质是扩展JSON格式。
带注释的JSON文件读取
场景描述
开发者在配置文件中常添加注释,
{
// 用户基本信息
"name": "李四",
/* 年龄:必须为正整数 */
"age": 25,
"hobbies": ["reading", "coding"]
}
标准JSON解析器(如Python的json模块、JavaScript的JSON.parse())会因注释语法报错(JSON.parse: expected property name or '}' at line 2 column 3)。
解决方案:预处理移除注释
需先通过正则表达式或字符串处理移除注释,再按标准JSON解析。
Python示例
使用正则表达式匹配并删除单行和多行注释:
import json
import re
def remove_comments(json_str):
# 移除单行注释(// 后到行尾)
json_str = re.sub(r'//.*', '', json_str)
# 移除多行注释(/* */)
json_str = re.sub(r'/\*.*?\*/', '', json_str, flags=re.DOTALL)
return json_str.strip()
# 读取带注释的JSON文件
with open('config.jsonc', 'r', encoding='utf-8') as f:
json_str = f.read()
# 预处理后解析
data = json.loads(remove_comments(json_str))
print(data["name"]) # 输出: 李四
JavaScript(Node.js)示例
利用正则表达式预处理:
const fs = require('fs');
const json = require('big-json'); // 或直接用JSON.parse
function removeComments(jsonStr) {
return jsonStr
.replace(/\/\/.*$/gm, '') // 移除单行注释
.replace(/\/\*[\s\S]*?\*\//g, ''); // 移除多行注释
}
const jsonStr = fs.readFileSync('config.jsonc', 'utf-8');
const data = JSON.parse(removeComments(jsonStr));
console.log(data.name); // 输出: 李四
美化格式(缩进/换行)的JSON文件读取
场景描述
美化格式JSON仅增加缩进和换行,不包含注释,
{
"name": "王五",
"address": {
"city": "北京",
"detail": "朝阳区\n某某街道"
},
"hobbies": [
"swimming",
"running"
]
}
这类文件本身就是合法JSON,可直接用标准解析器读取——缩进、换行、空格均符合JSON规范(JSON允许空白符)。
解决方案:直接标准解析
Python示例
import json
with open('pretty.json', 'r', encoding='utf-8') as f:
data = json.load(f)
print(data["address"]["detail"]) # 输出: 朝阳区\n某某街道(\n作为转义字符保留)
JavaScript示例
const data = JSON.parse(fs.readFileSync('pretty.json', 'utf-8'));
console.log(data.address.detail); // 输出: 朝阳区\n某某街道
多行文本/特殊分隔符的JSON文件读取
场景描述
字段值包含多行文本(如日志、长文本)或使用非标准引号(如单引号),
{
"name": '赵六', // 非标准单引号
"bio": "这是第一行\n这是第二行\n 这是缩进行"
}
标准JSON要求字符串必须用双引号,单引号会导致解析失败;多行文本本身合法(\n会被转义),但需注意原始换行符的处理。
解决方案:处理非标准引号,保留多行文本
Python示例:替换单引号为双引号
import json
def fix_quotes(json_str):
# 简单替换单引号为双引号(仅适用于简单场景,复杂场景需更严谨处理)
return json_str.replace("'", '"')
with open('special.json', 'r', encoding='utf-8') as f:
json_str = f.read()
data = json.loads(fix_quotes(json_str))
print(data["bio"]) # 输出: 这是第一行\n这是第二行\n 这是缩进行(\n作为转义字符)
# 若需保留原始换行符,可使用json.loads的`strict=False`(不推荐,可能引入风险)
# 或手动处理:data["bio"] = data["bio"].replace("\\n", "\n")
JavaScript示例:处理单引号
const jsonStr = `{"name": '赵六', "bio": "这是第一行\n这是第二行"}`;
const fixedJsonStr = jsonStr.replace(/'([^']*)'/g, '"$1"'); // 替换单引号为双引号
const data = JSON.parse(fixedJsonStr);
console.log(data.bio); // 输出: 这是第一行\n这是第二行
伪JSON(如JSON with Comments、YAML转JSON)读取
场景描述
部分工具(如VS Code配置、Webpack配置)使用“JSON with Comments”(.jsonc文件),允许注释;或YAML文件(缩进分隔)被误认为JSON,
{
// 开发环境配置
"env": "development",
"port": 3000,
// 数据库配置
"database": {
host: "localhost", // YAML风格无引号键
password: "123456"
}
}
这类文件可能混合注释、无引号键、YAML语法,无法直接用JSON解析器读取。
解决方案:使用专用库或转换工具
JSON with Comments(.jsonc)
-
Python:使用
json5库(支持注释、单引号、尾随逗号):pip install json5
import json5 with open('config.jsonc', 'r', encoding='utf-8') as f: data = json5.load(f) print(data["database"]["host"]) # 输出: localhost -
JavaScript:使用
json5库:npm install json5
const JSON5 = require('json5'); const data = JSON5.parse(fs.readFileSync('config.jsonc', 'utf-8')); console.log(data.database.host);
YAML转JSON(误认为JSON的YAML文件)
若文件本质是YAML(用缩进而非大括号),需先转换为JSON:
-
Python:使用
pyyaml库:pip install pyyaml
import yaml with open('config.yaml', 'r



还没有评论,来说两句吧...