jsonrepair
Repair invalid JSON documents.
Try it out in a minimal demo: https://josdejong.github.io/jsonrepair/
Use it in a full-fledged application: https://jsoneditoronline.org
Read the background article "How to fix JSON and validate it with ease"
The following issues can be fixed:
The jsonrepair
library has streaming support and can handle infinitely large documents.
Install
$ npm install jsonrepair
Note that in the lib
folder, there are builds for ESM, UMD, and CommonJs.
Use
Use the jsonrepair
function using an ES modules import:
import { jsonrepair } from 'jsonrepair'
try {
const json = "{name: 'John'}"
const repaired = jsonrepair(json)
console.log(repaired)
} catch (err) {
console.error(err)
}
Use the streaming API in Node.js:
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')
}
})
Use in CommonJS (not recommended):
const { jsonrepair } = require('jsonrepair')
const json = "{name: 'John'}"
console.log(jsonrepair(json))
Use with UMD in the browser (not recommended):
<script src="/node_modules/jsonrepair/lib/umd/jsonrepair.js"></script>
<script>
const { jsonrepair } = JSONRepair
const json = "{name: 'John'}"
console.log(jsonrepair(json))
</script>
API
Regular API
You can use jsonrepair
as a function or as a streaming transform. Broken JSON is passed to the function, and the function either returns the repaired JSON, or throws an JSONRepairError
exception when an issue is encountered which could not be solved.
jsonrepair(json: string) : string
Streaming API
The streaming API is availabe in jsonrepair/stream
and can be used in a Node.js stream. It consists of a transform function that can be used in a stream pipeline.
jsonrepairTransform(options?: { chunkSize?: number, bufferSize?: number }) : Transform
The option chunkSize
determines the size of the chunks that the transform outputs, and is 65536
bytes by default. Changing chunkSize
can influcence the performance.
The option bufferSize
determines how many bytes of the input and output stream are kept in memory and is also 65536
bytes by default. This buffer is used as a "moving window" on the input and output. This is necessary because jsonrepair
must look ahead or look back to see what to fix, and it must sometimes walk back the generated output to insert a missing comma for example. The bufferSize
must be larger than the length of the largest string and whitespace in the JSON data, otherwise, and error is thrown when processing the data. Making bufferSize
very large will result in more memory usage and less performance.
Command Line Interface (CLI)
When jsonrepair
is installed globally using npm, it can be used on the command line. To install jsonrepair
globally:
$ npm install -g jsonrepair
Usage:
$ jsonrepair [filename] {OPTIONS}
Options:
--version, -v Show application version
--help, -h Show this message
--output, -o Output file
--overwrite Overwrite the input file
--buffer Buffer size in bytes, for example 64K (default) or 1M
Example usage:
$ jsonrepair broken.json # Repair a file, output to console
$ jsonrepair broken.json > repaired.json # Repair a file, output to file
$ jsonrepair broken.json --output repaired.json # Repair a file, output to file
$ jsonrepair broken.json --overwrite # Repair a file, replace the file itself
$ cat broken.json | jsonrepair # Repair data from an input stream
$ cat broken.json | jsonrepair > repaired.json # Repair data from an input stream, output to file
Alternatives:
Similar libraries:
Develop
When implementing a fix or a new feature, it important to know that there are currently two implementations:
src/regular
This is a non-streaming implementation. The code is small and works for files up to 512MB, ideal for usage in the browser.src/streaming
A streaming implementation that can be used in Node.js. The code is larger and more complex, and the implementation uses a configurable bufferSize
and chunkSize
. When the parsed document contains a string or number that is longer than the configured bufferSize
, the library will throw an "Index out of range" error since it cannot hold the full string in the buffer. When configured with an infinite buffer size, the streaming implementation works the same as the regular implementation. In that case this out of range error cannot occur, but it makes the performance worse and the application can run out of memory when repairing large documents.
Both implementations are tested against the same suite of unit tests in src/index.test.ts
.
To build the library (ESM, CommonJs, and UMD output in the folder lib
):
$ npm install
$ npm run build
To run the unit tests:
$ npm test
To run the linter (eslint):
$ npm run lint
To automatically fix linter issues:
$ npm run format
To run the linter, build all, and run unit tests and integration tests:
$ npm run build-and-test
Release
To release a new version:
$ npm run release
This will:
- lint
- test
- build
- increment the version number
- push the changes to git, add a git version tag
- publish the npm package
To try the build and see the change list without actually publishing:
$ npm run release-dry-run
License
Released under the ISC license.