/marshaller

A lightweight way to serialize and deserialize complex data types non-destructively

Primary LanguageTypeScriptMIT LicenseMIT

Logo

A lightweight way to serialize and deserialize complex data types non-destructively

Downloads per month NPM version Dependencies Contributors code style: prettier License: MIT Support on Patreon

Description

Marshaller provides a lightweight way to serialize and deserialize complex data types non-destructively. Essentially, it is JSON.parse() and JSON.stringify with support for far more data types, circular references, and with the guarantee that whatever is serialized can be deserialized into the exact same representation without losing any information.

You can consider this to be direct replacements for the JSON.[stringify|parse] methods, provided through marshall for serialization and demarshall for deserialization.

Features

  • "JSON.parse/JSON.stringify on steroids"
  • Non-destructive serialization/deserialization of data
  • Supports Circular references
  • A wide variety of supported data types - from simple things as strings to complex things such as Maps, Sets and Typed Arrays

Table of Contents

Install

NPM

$ npm install @wessberg/marshaller

Yarn

$ yarn add @wessberg/marshaller

Supported data types and features

  • Anything that is JSON serializable today: number, boolean, string, array, object literal
  • References, including circular references
  • RegExp
  • Date
  • Map
  • Set
  • Symbol
  • BigInt
  • undefined
  • null
  • Int8Array
  • Int16Array
  • Int32Array
  • UInt8Array
  • UInt8ClampedArray
  • UInt16Array
  • UInt32Array
  • Float32Array
  • Float64Array
  • String
  • Number
  • Boolean

Usage

import {marshall, demarshall} from "@wessberg/marshaller";

// Marshall some complex data that wouldn't normally be JSON serializable
const marshallResult = marshall({
	a: new Set([1, 2, /foo/, {a: new Date(), b: new Float32Array([1, 2, 3])}])
});

// Demarshall it to get a structurally identical representation back of the data
const demarshallResult = demarshall(marshallResult);

Contributing

Do you want to contribute? Awesome! Please follow these recommendations.

Maintainers

Frederik Wessberg
Frederik Wessberg
@FredWessberg
Lead Developer

Backers

Patreon

Become a backer and get your name, avatar, and Twitter handle listed here.

Backers on Patreon

FAQ

Why are functions not supported

First, there are security considerations. But more importantly, functions can reference identifiers that lives in a lexical environment that is declared outside of the local scope of that function. Marshalling this data would require passing in a sandboxed environment which breaks the promise of the library - simple replacement for JSON, with non-destructive serialization/deserialization.

License

MIT © Frederik Wessberg (@FredWessberg) (Website)