# json-stable-stringify

> deterministic JSON.stringify() with custom sorting to get deterministic hashes from stringified results

Latest version **1.3.0** (published 2025-04-22) · MIT license · 0 weekly downloads

## Install

```sh
npm install json-stable-stringify
pnpm add json-stable-stringify
yarn add json-stable-stringify
bun add json-stable-stringify
```

## Health

**Score 45/100 (D)** — status: stable.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: stale.

## Facts

| | |
|---|---|
| Version | 1.3.0 |
| Published | 2025-04-22 |
| First published | 2013-07-17 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Node | >= 0.4 |
| Dependencies | 5 |
| Unpacked size | 35.6 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 79 |
| Author | James Halliday |
| Maintainers | ljharb |
| Keywords | json, stringify, deterministic, hash, sort, stable |

## Links

- npm: https://www.npmjs.com/package/json-stable-stringify
- Repository: https://github.com/ljharb/json-stable-stringify
- Issues: https://github.com/ljharb/json-stable-stringify/issues
- Funding: https://github.com/sponsors/ljharb
- npm.io page: https://npm.io/package/json-stable-stringify

## Dependencies (5)

- [isarray](https://npm.io/package/isarray.md) ^2.0.5
- [jsonify](https://npm.io/package/jsonify.md) ^0.0.1
- [call-bind](https://npm.io/package/call-bind.md) ^1.0.8
- [call-bound](https://npm.io/package/call-bound.md) ^1.0.4
- [object-keys](https://npm.io/package/object-keys.md) ^1.1.1

## Alternatives

- [@mapbox/jsonlint-lines-primitives](https://npm.io/package/@mapbox/jsonlint-lines-primitives.md) — 5.3M weekly downloads
- [reftools](https://npm.io/package/reftools.md) — 3.5M weekly downloads
- [@hey-api/openapi-ts](https://npm.io/package/@hey-api/openapi-ts.md) — 3.5M weekly downloads
- [@mapbox/geojson-rewind](https://npm.io/package/@mapbox/geojson-rewind.md) — 2.4M weekly downloads
- [turbo-stream](https://npm.io/package/turbo-stream.md) — 1.7M weekly downloads

## Recent versions

- 1.3.0 (latest) — 2025-04-22
- 1.2.1 — 2024-12-21
- 1.2.0 — 2024-12-17
- 1.1.1 — 2024-01-16
- 1.1.0 — 2023-11-13
- 1.0.2 — 2022-11-08
- 1.0.1 — 2016-02-02
- 1.0.0 — 2014-05-27
- 0.1.3 — 2014-05-27
- 0.1.2 — 2014-04-03
- 0.1.1 — 2013-12-22
- 0.1.0 — 2013-12-22
- 0.0.1 — 2013-07-18
- 0.0.0 — 2013-07-17

## README

# json-stable-stringify <sup>[![Version Badge][npm-version-svg]][package-url]</sup>

[![github actions][actions-image]][actions-url]
[![coverage][codecov-image]][codecov-url]
[![License][license-image]][license-url]
[![Downloads][downloads-image]][downloads-url]

[![npm badge][npm-badge-png]][package-url]

deterministic version of `JSON.stringify()` so you can get a consistent hash from stringified results

You can also pass in a custom comparison function.

# example

``` js
const stringify = require('json-stable-stringify');

const obj = { c: 8, b: [{ z: 6, y: 5, x: 4 }, 7], a: 3 };

console.log(stringify(obj));
```

output:

```
{"a":3,"b":[{"x":4,"y":5,"z":6},7],"c":8}
```

# methods

``` js
const stringify = require('json-stable-stringify')
```

<a id="var-str--stringifyobj-opts"></a>
## const str = stringify(obj, opts)

Return a deterministic stringified string `str` from the object `obj`.

## options

### cmp

If `opts` is given, you can supply an `opts.cmp` to have a custom comparison function for object keys.
Your function `opts.cmp` is called with these parameters:

``` js
opts.cmp({ key: akey, value: avalue }, { key: bkey, value: bvalue }, { get(key): value })
```

For example, to sort on the object key names in reverse order you could write:

``` js
const stringify = require('json-stable-stringify');

const obj = { c: 8, b: [{ z: 6, y: 5, x: 4 },7], a: 3 };

const s = stringify(obj, function (a, b) {
	return b.key.localeCompare(a.key);
});

console.log(s);
```

which results in the output string:

``` js
{"c":8,"b":[{"z":6,"y":5,"x":4},7],"a":3}
```

Or if you wanted to sort on the object values in reverse order, you could write:

``` js
const stringify = require('json-stable-stringify');

const obj = { d: 6, c: 5, b: [{ z: 3, y: 2, x: 1 }, 9], a: 10 };

const s = stringify(obj, function (a, b) {
	return a.value < b.value ? 1 : -1;
});

console.log(s);
```

which outputs:

``` js
{"d":6,"c":5,"b":[{"z":3,"y":2,"x":1},9],"a":10}
```

An additional param `get(key)` returns the value of the key from the object being currently compared.

### space

If you specify `opts.space`, it will indent the output for pretty-printing.
Valid values are strings (e.g. `{space: \t}`) or a number of spaces
(`{space: 3}`).

For example:

```js
const obj = { b: 1, a: { foo: 'bar', and: [1, 2, 3] } };

const s = stringify(obj, { space: '  ' });

console.log(s);
```

which outputs:

```
{
  "a": {
    "and": [
      1,
      2,
      3
    ],
    "foo": "bar"
  },
  "b": 1
}
```

### replacer

The replacer parameter is a function `opts.replacer(key, value)` that behaves the same as the replacer
[from the core JSON object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_native_JSON#The_replacer_parameter).

# install

With [npm](https://npmjs.org) do:

```
npm install json-stable-stringify
```

# license

MIT

[package-url]: https://npmjs.org/package/json-stable-stringify
[npm-version-svg]: https://versionbadg.es/ljharb/json-stable-stringify.svg
[deps-svg]: https://david-dm.org/ljharb/json-stable-stringify.svg
[deps-url]: https://david-dm.org/ljharb/json-stable-stringify
[dev-deps-svg]: https://david-dm.org/ljharb/json-stable-stringify/dev-status.svg
[dev-deps-url]: https://david-dm.org/ljharb/json-stable-stringify#info=devDependencies
[npm-badge-png]: https://nodei.co/npm/json-stable-stringify.png?downloads=true&stars=true
[license-image]: https://img.shields.io/npm/l/json-stable-stringify.svg
[license-url]: LICENSE
[downloads-image]: https://img.shields.io/npm/dm/json-stable-stringify.svg
[downloads-url]: https://npm-stat.com/charts.html?package=json-stable-stringify
[codecov-image]: https://codecov.io/gh/ljharb/json-stable-stringify/branch/main/graphs/badge.svg
[codecov-url]: https://app.codecov.io/gh/ljharb/json-stable-stringify/
[actions-image]: https://img.shields.io/endpoint?url=https://github-actions-badge-u3jn4tfpocch.runkit.sh/ljharb/json-stable-stringify
[actions-url]: https://github.com/ljharb/json-stable-stringify/actions

---
_Source: https://npm.io/package/json-stable-stringify · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
