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

Usage no npm install needed!

<script type="module">
  import wessbergMarshaller from 'https://cdn.skypack.dev/@wessberg/marshaller';



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


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.


  • "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



$ npm install @wessberg/marshaller


$ 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


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);


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


Frederik Wessberg
Frederik Wessberg
Lead Developer



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

Backers on Patreon


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.


MIT © Frederik Wessberg (@FredWessberg) (Website)