1 | var types = require('./types');
|
2 | var 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 | */
|
29 | module.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 | };
|