UNPKG

1.19 kBJavaScriptView Raw
1var types = require('./types');
2var deserialize = require('./deserialize');
3
4/**
5 * Similar to [object_hook][object_hook] in python, ES5 JSON.parse accepts
6 * a very not well-known [reviver][reviver] argument. This can be used to
7 * easily plug in to existing middleware like [body-parser][body-parser]
8 * for express:
9 *
10 * ```javascript
11 * var EJSON = require('mongodb-extended-json'),
12 * bodyParser = require('body-parser'),
13 * app = require('express')();
14 *
15 * app.post('/save', bodyParser.json({reviver: EJSON.reviver}), function(req, res){
16 * console.log('omg now it has extended types', req.body);
17 * // Do stuff
18 * });
19 * ```
20 *
21 * [object_hook]: https://docs.python.org/2/library/json.html#json.load
22 * [reviver]: http://mdn.io/json.parse#Example.3A_Using_the_reviver_parameter
23 * [body-parser]: http://npm.im/body-parser
24 *
25 * @param {String} k - The key in the object.
26 * @param {Any} v - Contents of `k`.
27 * @return {Any}
28 */
29module.exports = function reviver(k, v) {
30 if (!types.isObject(v)) {
31 return v;
32 }
33 var firstKey = Object.keys(v)[0];
34
35 if (!firstKey || types.special.keys.indexOf(firstKey) === -1) {
36 return v;
37 }
38 return deserialize(v);
39};