Coder Social home page Coder Social logo

epoberezkin / fast-json-stable-stringify Goto Github PK

View Code? Open in Web Editor NEW

This project forked from carlos8f/json-stable-stringify

277.0 4.0 33.0 93 KB

Deterministic JSON.stringify() - a faster version of @substack's json-stable-strigify without jsonify.

License: Other

JavaScript 100.00%

fast-json-stable-stringify's Introduction

fast-json-stable-stringify

Deterministic JSON.stringify() - a faster version of @substack's json-stable-strigify without jsonify.

You can also pass in a custom comparison function.

Build Status Coverage Status

example

var stringify = require('fast-json-stable-stringify');
var 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

var stringify = require('fast-json-stable-stringify')

var 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:

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

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

var stringify = require('fast-json-stable-stringify');

var obj = { c: 8, b: [{z:6,y:5,x:4},7], a: 3 };
var s = stringify(obj, function (a, b) {
    return a.key < b.key ? 1 : -1;
});
console.log(s);

which results in the output string:

{"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:

var stringify = require('fast-json-stable-stringify');

var obj = { d: 6, c: 5, b: [{z:3,y:2,x:1},9], a: 10 };
var s = stringify(obj, function (a, b) {
    return a.value < b.value ? 1 : -1;
});
console.log(s);

which outputs:

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

cycles

Pass true in opts.cycles to stringify circular property as __cycle__ - the result will not be a valid JSON string in this case.

TypeError will be thrown in case of circular object without this option.

install

With npm do:

npm install fast-json-stable-stringify

benchmark

To run benchmark (requires Node.js 6+):

node benchmark

Results:

fast-json-stable-stringify x 17,189 ops/sec ±1.43% (83 runs sampled)
json-stable-stringify x 13,634 ops/sec ±1.39% (85 runs sampled)
fast-stable-stringify x 20,212 ops/sec ±1.20% (84 runs sampled)
faster-stable-stringify x 15,549 ops/sec ±1.12% (84 runs sampled)
The fastest is fast-stable-stringify

Enterprise support

fast-json-stable-stringify package is a part of Tidelift enterprise subscription - it provides a centralised commercial support to open-source software users, in addition to the support provided by software maintainers.

Security contact

To report a security vulnerability, please use the Tidelift security contact. Tidelift will coordinate the fix and disclosure. Please do NOT report security vulnerability via GitHub issues.

license

MIT

fast-json-stable-stringify's People

Contributors

abdonrd avatar domoritz avatar epoberezkin avatar kapetan avatar michaeldeboey avatar mvayngrib avatar rickeyre avatar rina-sleeping avatar rprieto avatar thomsbg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

fast-json-stable-stringify's Issues

Update Typescript declaration file to use standard export syntax.

The current index.d.ts file looks like this:

declare module 'fast-json-stable-stringify' {
  function stringify(obj: any): string;
  export = stringify;
}

This makes it impossible to use this module from Typescript unless a certain flag is turned on (I forget the flag name) because this syntax is outdated.

I recommend updating the index.d.ts file to:

export default function stringify(obj: any): string

Not sure if that's correct, but I think it is?

String instances are transformed into objects

Stumbled upon this one when attempting to use this library to normalize API outputs.
I'm not sure if it's an expected behavior.

stringify({ a: new String('hello') })
//    {"a":{"0":"h","1":"e","2":"l","3":"l","4":"o"}} 

While using JSON.stringify({ a: new String('hello') }) returns {"a":"hello"}.

String instances, created using new String() shouldn't usually be returned in place of strings, but some poor function in some codebases returns string instances using new String. For these cases, it'd be nice if the output would produce symmetrical rendering of Strings than JSON.stringify() for user looking for a drop-in replacement.

Consider accepting a `space` option.

One feature that is lost in the transition from json-stable-stringify to fast-json-stable-stringify is the space option. It may be a performance hiccup, but including it would allow easier transition from projects that use json-stable-stringify.

Prototype pollution

I would like to report a Prototype pollution vulnerability in "fast-json-stable-stringify".

If required I can submit a POC through a secured channel. Thanks.

Performance increase with different design

I changed the algorithm to use the fact that object keys come in the order of creation.
Instead of concatinating strings I just sort the properties of objects and to JSON.stringify over the whole result.
Also replaced Object.keys with Object.getOwnPropertyNames since it seems faster.
All tests are green and performance is better and at times faster than fast-stable-stringify.
Code is also smaller.

Is this of interest and should I make a pull request?

Reduce the size of the npm package by limiting the included files

Looks like the files property (https://docs.npmjs.com/files/package.json#files) is not used in package.json to specify the included files, nor is the .npmignore file (https://docs.npmjs.com/misc/developers#keeping-files-out-of-your-package) is being used for blacklisting unwanted files, for the package published to npm.

Would you consider adding either the files property or the .npmignore file, so that the resulting package file would have smaller size?

The current size can be seen when executing the command npm pack (https://docs.npmjs.com/cli/pack).

This issue was create via tawata

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.