Git Product home page Git Product logo

json-s's Introduction

JSON-S

JSON-Serializer

Same as JSON but with added support for:

  • Date
  • undefined
  • NaN
  • Inifinity
  • RegExp

JSON is a good serializer for JavaScript values but is lacking some JavaScript types such as Date:

const assert = require("assert");

let obj = {
  time: new Date("2042-01-01"),
};

// JSON converts dates to strings
assert(obj.time.constructor === Date);
obj = JSON.parse(JSON.stringify(obj));
assert(obj.time.constructor === String);
assert(obj.time === "2042-01-01T00:00:00.000Z");

Whereas with JSON-S:

const assert = require("assert");
const JSON = require("@brillout/json-s");

let obj = {
  time: new Date("2042-01-01"),
};

// JSON-S preserves Date
assert(obj.time.constructor === Date);
obj = JSON.parse(JSON.stringify(obj));
assert(obj.time.constructor === Date);
assert(obj.time.getTime() === new Date("2042-01-01").getTime());

Contents


Usage

// npm install @brillout/json-s
const parse = require("@brillout/json-s/parse");
const stringify = require("@brillout/json-s/stringify");

const obj = {
  hello: "from the future",
  time: new Date("2042-01-01"),
};

// Serialize with JSON-S
const obj_serialized = stringify(obj);

// Deserialize a JSON-S string
const obj_deserialized = parse(obj_serialized);

The JSON-S functions stringify and parse have the exact same interface than JSON.stringify and JSON.parse. So you can use all JSON's options.


Full Example

Example exposing all differences between JSON and JSON-S.

// /examples/json-s.js

const assert = require("assert");

const parse = require("@brillout/json-s/parse");
const stringify = require("@brillout/json-s/stringify");

const obj = {
  date: new Date(),
  undefined: undefined,
  NaN: NaN,
  Infinity: Infinity,
  regexp: /^\d+$/g,
};

// All of `obj` can be serialized with JSON-S
const obj2 = parse(stringify(obj));
assert(obj2.date.getTime() === obj.date.getTime());
assert(obj2.undefined === undefined && "undefined" in obj2);
assert(isNaN(obj2.NaN));
assert(obj2.Infinity === Infinity);
assert(obj2.regexp.toString() === obj.regexp.toString());

// JSON cannot serialize any of `obj`
const obj3 = JSON.parse(JSON.stringify(obj));
// JSON converts dates to strings
assert(obj3.constructor !== Date);
// JSON removes properties with a value of `undefined`
assert(!("undefined" in obj3));
// JSON converts `NaN` to `null`
assert(obj3.NaN === null);
// JSON converts `Infinity` to `null`
assert(obj3.Infinity === null);
// JSON converts RegExp to an empty object
assert(
  obj3.regexp.constructor === Object && Object.keys(obj3.regexp).length === 0
);

To run the example:

$ git clone [email protected]:brillout/json-s
$ cd json-s
$ npm install
$ npm run self-link
$ node ./examples/json-s.js

The npm run self-link is required to be able to self require('@brillout/json-s').


How it Works

Let's see how JSON-S serializes an object:

// /examples/inspect.js

const JSON = require("@brillout/json-s");

const obj = {
  date: new Date(),
  undefined: undefined,
  collision: "!undefined",
  NaN: NaN,
  Infinity: Infinity,
  regexp: /^\d+$/g,
};

console.log(JSON.stringify(obj, undefined, 2));
// Prints:
/*
{
  "date": "!Date:2021-01-12T22:15:56.319Z",
  "undefined": "!undefined",
  "collision": "!!undefined"
  "NaN": "!NaN",
  "Infinity": "!Infinity",
  "regexp": "!RegExp:/^\\d+$/g"
}
*/

JSON-S is based on JSON while using prefixed strings for unsupported types.

JSON-S uses the native JSON.parse and JSON.stringify functions while modifying the serialization of unsupported types.

json-s's People

Contributors

brillout avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.