2015-12-06
yorkie opened this issue · 2 comments
yorkie commented
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()})
在开发这个库的过程中,我尝试过很多方案:
- 使用
JSON.stringify(input, replacer)
的方式去重写,不过后来发现最后我所需要的并不是一个标准的 JSON,因此无法通过这种方法得出; - 在上一个方案未果后,决定试试
Date
的值使用一个特殊的散列值存储在一个WeakMap
内,然后在最后使用正则换掉,不过这种方法不够直观简单,WeakMap
的API也不够稳定,于是作罢。
在尝试方法2时,还发现了JSON.stringify
的replacer
函数有一个比较奇怪的特性,比如以下代码:
JSON.stringify({
foo: {
date: new Date()
}
}, function (key, val) {
console.log(key, val);
});
当key
为"date"的时候,发现对应的val
已经不是一个字符串类型了,所以只能在上一层,即key
等于"foo"的时候,来判断。
geekplux commented
yorkie commented
有几个原因吧:
- 你给的链接类似于一本书了,用
git
管理是对的,日记的话,我觉得不存在版本问题,都是一次性的 - 这里比较方便吧,主要是想用一些自带的功能,比如可以列出一些完成的PR,会有链接
org-mode 虽然好用,但是支持还是不够,我现在还是只是在团队内部的 wiki 用那个啦~