Which is Better JSON Serialization Libraries?
flatted vs json-stringify-safe vs circular-json vs json-stringify-deterministic
1 Year
flattedjson-stringify-safecircular-jsonjson-stringify-deterministicSimilar Packages:
What's JSON Serialization Libraries?

JSON serialization libraries are essential tools in web development for converting JavaScript objects into JSON format, which can be easily transmitted over networks or stored. These libraries address various challenges associated with standard JSON serialization, such as handling circular references, ensuring deterministic output, and providing safe serialization methods. By utilizing these libraries, developers can enhance data integrity and improve the reliability of their applications when dealing with complex object structures.

NPM Package Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
flatted43,682,8291,04240.3 kB29 months agoISC
json-stringify-safe28,024,061550-79 years agoISC
circular-json2,151,809606-06 years agoMIT
json-stringify-deterministic85,4533611.6 kB0a year agoMIT
Feature Comparison: flatted vs json-stringify-safe vs circular-json vs json-stringify-deterministic

Circular Reference Handling

  • flatted: Flatted also supports circular references, offering a modern approach to serialization that is optimized for performance while maintaining the ability to handle such cases.
  • json-stringify-safe: json-stringify-safe can handle circular references by providing a safe serialization process, allowing developers to avoid runtime errors.
  • circular-json: Circular-JSON is specifically designed to handle circular references in JavaScript objects, allowing developers to serialize complex object graphs without running into errors.
  • json-stringify-deterministic: This package does not handle circular references, as its primary focus is on producing deterministic output. Therefore, it is not suitable for objects with circular dependencies.

Deterministic Output

  • flatted: Flatted does not provide deterministic output either, focusing instead on performance and circular reference handling.
  • json-stringify-safe: json-stringify-safe does not guarantee deterministic output, as it prioritizes safe serialization over property order.
  • circular-json: Circular-JSON does not guarantee deterministic output; the order of properties in the serialized string may vary based on the object's structure.
  • json-stringify-deterministic: This package excels in producing deterministic JSON output, ensuring that the serialized result is consistent across multiple calls, which is essential for data integrity in caching and comparisons.

Performance

  • flatted: Flatted is designed with performance in mind, providing faster serialization and deserialization processes than Circular-JSON, making it suitable for high-performance applications.
  • json-stringify-safe: json-stringify-safe is efficient in handling serialization, but its performance may vary depending on the complexity of the object being serialized.
  • circular-json: While Circular-JSON is effective for circular references, its performance may not be optimal compared to newer libraries, especially for large datasets.
  • json-stringify-deterministic: This package may have performance overhead due to its focus on ensuring deterministic output, which could slow down serialization for large or complex objects.

Error Handling

  • flatted: Flatted gracefully handles circular references and does not throw errors, making it a more robust choice for complex data structures.
  • json-stringify-safe: json-stringify-safe provides mechanisms for error handling, allowing developers to specify custom error messages or replacement functions when serialization fails.
  • circular-json: Circular-JSON will throw an error if it encounters circular references unless it is specifically designed to handle them, which can lead to runtime issues.
  • json-stringify-deterministic: This package does not handle errors related to circular references, as its main focus is on producing consistent output.

Use Cases

  • flatted: Best suited for modern applications that require efficient serialization of complex objects, including those with circular references.
  • json-stringify-safe: Recommended for applications that need to safely serialize potentially problematic objects without crashing.
  • circular-json: Ideal for applications that frequently deal with circular references, such as complex data models or graphs.
  • json-stringify-deterministic: Perfect for scenarios where consistent JSON output is critical, such as caching, logging, or generating hashes.
How to Choose: flatted vs json-stringify-safe vs circular-json vs json-stringify-deterministic
  • flatted: Opt for Flatted when you require a modern solution for serializing and deserializing objects with circular references. It is designed to be a more efficient and faster alternative to Circular-JSON, with a focus on performance and compatibility with the latest JavaScript features.
  • json-stringify-safe: Use json-stringify-safe when you want to safely serialize objects without encountering errors due to circular references. It provides a fallback mechanism that allows you to specify a replacement function or a custom error message, making it a robust choice for error-prone data.
  • circular-json: Choose Circular-JSON if you need to serialize objects that contain circular references. It allows you to stringify such objects without throwing errors, making it suitable for complex data structures.
  • json-stringify-deterministic: Select json-stringify-deterministic if you need consistent and repeatable JSON output. This package ensures that the serialized output is always in the same order, which is crucial for scenarios like caching or generating hashes from JSON data.
README for flatted

flatted

Downloads Coverage Status Build Status License: ISC WebReflection status

snow flake

Social Media Photo by Matt Seymour on Unsplash

A super light (0.5K) and fast circular JSON parser, directly from the creator of CircularJSON.

Available also for PHP.

Available also for Python.


Announcement 📣

There is a standard approach to recursion and more data-types than what JSON allows, and it's part of the Structured Clone polyfill.

Beside acting as a polyfill, its @ungap/structured-clone/json export provides both stringify and parse, and it's been tested for being faster than flatted, but its produced output is also smaller than flatted in general.

The @ungap/structured-clone module is, in short, a drop in replacement for flatted, but it's not compatible with flatted specialized syntax.

However, if recursion, as well as more data-types, are what you are after, or interesting for your projects/use cases, consider switching to this new module whenever you can 👍


npm i flatted

Usable via CDN or as regular module.

// ESM
import {parse, stringify, toJSON, fromJSON} from 'flatted';

// CJS
const {parse, stringify, toJSON, fromJSON} = require('flatted');

const a = [{}];
a[0].a = a;
a.push(a);

stringify(a); // [["1","0"],{"a":"0"}]

toJSON and fromJSON

If you'd like to implicitly survive JSON serialization, these two helpers helps:

import {toJSON, fromJSON} from 'flatted';

class RecursiveMap extends Map {
  static fromJSON(any) {
    return new this(fromJSON(any));
  }
  toJSON() {
    return toJSON([...this.entries()]);
  }
}

const recursive = new RecursiveMap;
const same = {};
same.same = same;
recursive.set('same', same);

const asString = JSON.stringify(recursive);
const asMap = RecursiveMap.fromJSON(JSON.parse(asString));
asMap.get('same') === asMap.get('same').same;
// true

Flatted VS JSON

As it is for every other specialized format capable of serializing and deserializing circular data, you should never JSON.parse(Flatted.stringify(data)), and you should never Flatted.parse(JSON.stringify(data)).

The only way this could work is to Flatted.parse(Flatted.stringify(data)), as it is also for CircularJSON or any other, otherwise there's no granted data integrity.

Also please note this project serializes and deserializes only data compatible with JSON, so that sockets, or anything else with internal classes different from those allowed by JSON standard, won't be serialized and unserialized as expected.

New in V1: Exact same JSON API

  • Added a reviver parameter to .parse(string, reviver) and revive your own objects.
  • Added a replacer and a space parameter to .stringify(object, replacer, space) for feature parity with JSON signature.

Compatibility

All ECMAScript engines compatible with Map, Set, Object.keys, and Array.prototype.reduce will work, even if polyfilled.

How does it work ?

While stringifying, all Objects, including Arrays, and strings, are flattened out and replaced as unique index. *

Once parsed, all indexes will be replaced through the flattened collection.

* represented as string to avoid conflicts with numbers

// logic example
var a = [{one: 1}, {two: '2'}];
a[0].a = a;
// a is the main object, will be at index '0'
// {one: 1} is the second object, index '1'
// {two: '2'} the third, in '2', and it has a string
// which will be found at index '3'

Flatted.stringify(a);
// [["1","2"],{"one":1,"a":"0"},{"two":"3"},"2"]
// a[one,two]    {one: 1, a}    {two: '2'}  '2'