https://github.com/luzlab/ejson-extras
Extends EJSON with additional types
https://github.com/luzlab/ejson-extras
ejson meteorjs
Last synced: 3 months ago
JSON representation
Extends EJSON with additional types
- Host: GitHub
- URL: https://github.com/luzlab/ejson-extras
- Owner: luzlab
- Created: 2017-11-30T06:37:26.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2018-01-18T06:53:21.000Z (over 8 years ago)
- Last Synced: 2025-11-03T22:22:01.135Z (7 months ago)
- Topics: ejson, meteorjs
- Language: JavaScript
- Size: 39.1 KB
- Stars: 2
- Watchers: 1
- Forks: 1
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Description
`ejson` extends JSON to support more types, including user-defined types.
`ejson-extras` adds support for additional types not included in `ejson`, such
as the native `Map`. `ejson-extras` also enables importing EJSON-encoded JSON
files.
# Usage
```javascript
const EJSON = require('ejson');
require('ejson-extras').apply();
const map1 = new Map().set('foo', 'bar').set('hello', 'world');
EJSON.stringify(map1); // '{"$type":"Map","$value":"[[\\"foo\\",\\"bar\\"],[\\"hello\\",\\"world\\"]]"}'
JSON.stringify(map1); // '{}'
const string = '{"$type":"Map","$value":"[[\\"hello\\",\\"world\\"]]"}';
EJSON.parse(string); // Map { 'hello' => 'world' }
const map2 = new Map().set('hello', 'world').set('foo', 'bar');
EJSON.equals(map1, map2); // true
```
```javascript
// test.json
{ "$type": "Map", "$value": "[[\"hello\",\"world\"]]" }
// in your javascript file
require('ejson-extras').apply();
let data = require('./test.json') // Map { 'hello' => 'world' }
```
# Supported Types
Currently, `ejson-extras` adds support for the following types:
* Maps
* [Qtys](https://github.com/gentooboontoo/js-quantities)
Please submit an issue if you'd like to see an addtional type.
# Creating a custom type
Adding an additional type is as easy as adding a file to the /types directory.
Here is a sample type file for supporting the native `Map` object:
```javascript
module.exports = {
prototype: Map.prototype,
shims: {
typeName() {
return 'Map';
},
toJSONValue() {
return JSON.stringify([...this]);
},
clone() {
return new Map(this);
},
equals(other) {
if (this.size !== other.size) return false;
Array.from(other.entries()).keys(key => {
return this.get(key) == other.get(key);
});
},
},
factory(json) {
return new Map(JSON.parse(jsonStr));
},
typeName: 'Map',
};
```
# Peer Dependancies
Many custom types will require a peer dependancy. An example of this is
`jsQuantities.js`, in this case we use `try-require` to import the peer library.
If the peer library isn't found, ejson-extras will skip adding support for that
particular type.
# Changes
1.0.15 - Fixed Map EJSON stringify/parsing bug.
1.0.11 - Fixed patching of 'require' inside Meteor.
1.0.10 - Fixed ejson detection and import inside Meteor.
1.0.9 - Reverted to standard try/catch syntax.
1.0.8 - Handles multiple calls to apply().
1.0.7 - Added Meteor autodetection for patching of bundled EJSON.
1.0.6 - Removed dependancy on `fs` to enable browser usage of `ejson-extras`.