Open yorkie opened 8 years ago
今天完成了一个新库: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转换成字符串再插入数据库中了,这个不是我们想要的结果。
input
Date
JSON.stringify
因此,typify-json 使用了与JSON类似的 API:
JSON
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)
WeakMap
在尝试方法2时,还发现了JSON.stringify的replacer函数有一个比较奇怪的特性,比如以下代码:
replacer
JSON.stringify({ foo: { date: new Date() } }, function (key, val) { console.log(key, val); });
当key为"date"的时候,发现对应的val已经不是一个字符串类型了,所以只能在上一层,即key等于"foo"的时候,来判断。
key
val
为什么写在issues里啊,我觉得可以用org-mode写,然后导出html,放在github上,你看我的:
http://geekplux.com/wiki/
我也是刚开始写
有几个原因吧:
git
org-mode 虽然好用,但是支持还是不够,我现在还是只是在团队内部的 wiki 用那个啦~
typify-json
今天完成了一个新库:https://github.com/weflex/typify-json ,创造这个库的原因起于 Fibula.js 的开发过程中,我使用了如下的代码:
如果
input
的值包含有Date
这样的值,那么JSON.stringify
的时候就会默认地把Date
转换成字符串再插入数据库中了,这个不是我们想要的结果。因此,typify-json 使用了与
JSON
类似的 API:这样如果我们输入:
那它等价于如下的"Shell语句":
在开发这个库的过程中,我尝试过很多方案:
JSON.stringify(input, replacer)
的方式去重写,不过后来发现最后我所需要的并不是一个标准的 JSON,因此无法通过这种方法得出;Date
的值使用一个特殊的散列值存储在一个WeakMap
内,然后在最后使用正则换掉,不过这种方法不够直观简单,WeakMap
的API也不够稳定,于是作罢。在尝试方法2时,还发现了
JSON.stringify
的replacer
函数有一个比较奇怪的特性,比如以下代码:当
key
为"date"的时候,发现对应的val
已经不是一个字符串类型了,所以只能在上一层,即key
等于"foo"的时候,来判断。