me icon indicating copy to clipboard operation
me copied to clipboard

2015-12-06

Open yorkie opened this issue 8 years ago • 2 comments

typify-json

今天完成了一个新库:https://github.com/weflex/typify-json ,创造这个库的原因起于 Fibula.js 的开发过程中,我使用了如下的代码:

const exec = require('child_process').execSync;
exec(`mongo --eval "db.foo.insert(${JSON.stringify(input)})"`);

如果input的值包含有Date这样的值,那么JSON.stringify的时候就会默认地把Date转换成字符串再插入数据库中了,这个不是我们想要的结果。

因此,typify-json 使用了与JSON类似的 API:

const typifyJSON = require('typify-json');
const exec = require('child_process').execSync;
exec(`mongo --eval "db.foo.insert(${typifyJSON.stringify(input)})"`);

这样如果我们输入:

{
  "date": new Date()
}

那它等价于如下的"Shell语句":

> db.foo.insert({"date":new Date()})

在开发这个库的过程中,我尝试过很多方案:

  1. 使用JSON.stringify(input, replacer)的方式去重写,不过后来发现最后我所需要的并不是一个标准的 JSON,因此无法通过这种方法得出;
  2. 在上一个方案未果后,决定试试Date的值使用一个特殊的散列值存储在一个WeakMap内,然后在最后使用正则换掉,不过这种方法不够直观简单,WeakMap的API也不够稳定,于是作罢。

在尝试方法2时,还发现了JSON.stringifyreplacer函数有一个比较奇怪的特性,比如以下代码:

JSON.stringify({
  foo: {
    date: new Date()
  }
}, function (key, val) {
  console.log(key, val);
});

key为"date"的时候,发现对应的val已经不是一个字符串类型了,所以只能在上一层,即key等于"foo"的时候,来判断。

yorkie avatar Dec 06 '15 07:12 yorkie

为什么写在issues里啊,我觉得可以用org-mode写,然后导出html,放在github上,你看我的:

http://geekplux.com/wiki/

我也是刚开始写

geekplux avatar Dec 07 '15 09:12 geekplux

有几个原因吧:

  1. 你给的链接类似于一本书了,用git管理是对的,日记的话,我觉得不存在版本问题,都是一次性的
  2. 这里比较方便吧,主要是想用一些自带的功能,比如可以列出一些完成的PR,会有链接

org-mode 虽然好用,但是支持还是不够,我现在还是只是在团队内部的 wiki 用那个啦~

yorkie avatar Dec 07 '15 10:12 yorkie