jsonrepair
修复无效的JSON文档。
在最小演示中试用:https://josdejong.github.io/jsonrepair/
在功能齐全的应用程序中使用:https://jsoneditoronline.org
阅读背景文章"如何轻松修复和验证JSON"
可以修复以下问题:
- 为键添加缺失的引号
- 添加缺失的转义字符
- 添加缺失的逗号
- 添加缺失的闭合括号
- 修复截断的JSON
- 将单引号替换为双引号
- 将特殊引号字符(如
"..."
)替换为常规双引号 - 将特殊空白字符替换为常规空格
- 将Python常量
None
、True
和False
替换为null
、true
和false
- 删除尾随逗号
- 删除注释,如
/* ... */
和// ...
- 删除数组和对象中的省略号,如
[1, 2, 3, ...]
- 删除JSONP表示法,如
callback({ ... })
- 从转义字符串中删除转义字符,如
{\"stringified\": \"content\"}
- 删除MongoDB数据类型,如
NumberLong(2)
和ISODate("2012-12-19T06:01:17.171Z")
- 连接字符串,如
"long text" + "more text on next line"
- 将换行分隔的JSON转换为有效的JSON数组,例如:
{ "id": 1, "name": "John" } { "id": 2, "name": "Sarah" }
jsonrepair
库支持流式处理,可以处理无限大的文档。
安装
$ npm install jsonrepair
注意在lib
文件夹中有ESM、UMD和CommonJs的构建版本。
使用
ES模块
使用ES模块导入来使用jsonrepair
函数:
import { jsonrepair } from 'jsonrepair'
try {
// 以下是无效的JSON:它由从JavaScript代码库复制的JSON内容组成,
// 其中键缺少双引号,并且字符串使用单引号:
const json = "{name: 'John'}"
const repaired = jsonrepair(json)
console.log(repaired) // '{"name": "John"}'
} catch (err) {
console.error(err)
}
流式API
在Node.js中使用流式API:
import { createReadStream, createWriteStream } from 'node:fs'
import { pipeline } from 'node:stream'
import { jsonrepairTransform } from 'jsonrepair/stream'
const inputStream = createReadStream('./data/broken.json')
const outputStream = createWriteStream('./data/repaired.json')
pipeline(inputStream, jsonrepairTransform(), outputStream, (err) => {
if (err) {
console.error(err)
} else {
console.log('done')
}
})
// 或者使用.pipe()代替pipeline():
// inputStream
// .pipe(jsonrepairTransform())
// .pipe(outputStream)
// .on('error', (err) => console.error(err))
// .on('finish', () => console.log('done'))
CommonJS
在CommonJS中使用(不推荐):
const { jsonrepair } = require('jsonrepair')
const json = "{name: 'John'}"
console.log(jsonrepair(json)) // '{"name": "John"}'
UMD
在浏览器中使用UMD(不推荐):
<script src="/node_modules/jsonrepair/lib/umd/jsonrepair.js"></script>
<script>
const { jsonrepair } = JSONRepair
const json = "{name: 'John'}"
console.log(jsonrepair(json)) // '{"name": "John"}'
</script>
Python
通过PythonMonkey
在Python中使用。
-
通过
npm install jsonrepair
安装jsonrepair
-
通过
pip install pythonmonkey
安装PythonMonkey
-
在Python脚本中使用这些库:
import pythonmonkey jsonrepair = pythonmonkey.require('jsonrepair').jsonrepair json = "[1,2,3," repaired = jsonrepair(json) print(repaired) # [1,2,3]
API
常规API
您可以将jsonrepair
作为函数或流式转换使用。将损坏的JSON传递给函数,函数要么返回修复后的JSON,要么在遇到无法解决的问题时抛出JSONRepairError
异常。
// @throws JSONRepairError
jsonrepair(json: string) : string
流式API
流式API可在jsonrepair/stream
中使用,可用于Node.js流。它包含一个可在流管道中使用的转换函数。
jsonrepairTransform(options?: { chunkSize?: number, bufferSize?: number }) : Transform
选项chunkSize
决定了转换输出的块大小,默认为65536
字节。更改chunkSize
可能会影响性能。
选项bufferSize
决定了在内存中保留的输入和输出流的字节数,默认也是65536
字节。此缓冲区用作输入和输出的"移动窗口"。这是必要的,因为jsonrepair
必须向前或向后查看以确定要修复的内容,有时必须回溯生成的输出以插入缺失的逗号。bufferSize
必须大于JSON数据中最长字符串和空白的长度,否则在处理数据时会抛出错误。将bufferSize
设置得很大会导致更多的内存使用和性能下降。
命令行界面(CLI)
当使用npm全局安装jsonrepair
时,可以在命令行中使用它。要全局安装jsonrepair
:
$ npm install -g jsonrepair
用法:
$ jsonrepair [filename] {OPTIONS}
选项:
--version, -v 显示应用程序版本
--help, -h 显示此消息
--output, -o 输出文件
--overwrite 覆盖输入文件
--buffer 缓冲区大小(字节),例如64K(默认)或1M
使用示例:
$ jsonrepair broken.json # 修复文件,输出到控制台
$ jsonrepair broken.json > repaired.json # 修复文件,输出到文件
$ jsonrepair broken.json --output repaired.json # 修复文件,输出到文件
$ jsonrepair broken.json --overwrite # 修复文件,替换文件本身
$ cat broken.json | jsonrepair # 从输入流修复数据
$ cat broken.json | jsonrepair > repaired.json # 从输入流修复数据,输出到文件
替代方案:
类似的库:
开发
在实现修复或新功能时,重要的是要知道目前有两种实现:
src/regular
这是一个非流式实现。代码量小,适用于最大512MB的文件,非常适合在浏览器中使用。src/streaming
可在Node.js中使用的流式实现。代码量更大,更复杂,实现使用可配置的bufferSize
和chunkSize
。当解析的文档包含长度超过配置的bufferSize
的字符串或数字时,库将抛出"索引超出范围"错误,因为它无法在缓冲区中保存完整的字符串。当配置为无限缓冲区大小时,流式实现的工作方式与常规实现相同。在这种情况下,不会出现此范围错误,但会降低性能,并且应用程序在修复大型文档时可能会耗尽内存。
这两种实现都通过src/index.test.ts
中的相同单元测试套件进行测试。
脚本:
脚本 | 描述 |
---|---|
npm install | 一次性安装依赖项 |
npm run build | 构建库(ESM、CommonJs和UMD输出到lib 文件夹) |
npm test | 运行单元测试 |
npm run lint | 运行代码检查器(eslint) |
npm run format | 自动修复代码检查问题 |
npm run build-and-test | 运行代码检查器、构建所有内容,并运行单元测试和集成测试 |
npm run release | 发布新版本。这将进行代码检查、测试、构建、增加版本号、将更改推送到git、添加git版本标签并发布npm包。 |
npm run release-dry-run | 运行所有发布步骤并查看更改列表,但不实际发布 |
许可证
根据ISC许可证发布。