wzp
2021-05-13 7d694a9113118daec5be7ac224dab46a3b20f106
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
'use strict';
 
//TODO: handle reviver/dehydrate function like normal
//and handle indentation, like normal.
//if anyone needs this... please send pull request.
 
exports.stringify = function stringify(o) {
  if (o && Buffer.isBuffer(o))
    return JSON.stringify(':base64:' + o.toString('base64'));
 
  if (o && o.toJSON) o = o.toJSON();
 
  if (o && 'object' === typeof o) {
    var s = '';
    var array = Array.isArray(o);
    s = array ? '[' : '{';
    var first = true;
 
    for (var k in o) {
      var ignore =
        'function' == typeof o[k] || (!array && 'undefined' === typeof o[k]);
      if (Object.hasOwnProperty.call(o, k) && !ignore) {
        if (!first) s += ',';
        first = false;
        if (array) {
          s += stringify(o[k]);
        } else if (o[k] !== void 0) {
          s += stringify(k) + ':' + stringify(o[k]);
        }
      }
    }
 
    s += array ? ']' : '}';
 
    return s;
  } else if ('string' === typeof o) {
    return JSON.stringify(/^:/.test(o) ? ':' + o : o);
  } else if ('undefined' === typeof o) {
    return 'null';
  } else return JSON.stringify(o);
};
 
exports.parse = function(s) {
  return JSON.parse(s, function(key, value) {
    if ('string' === typeof value) {
      if (/^:base64:/.test(value))
        return new Buffer(value.substring(8), 'base64');
      else return /^:/.test(value) ? value.substring(1) : value;
    }
    return value;
  });
};