'在 NodeJS 上解析 PyDict'

一般情况下呢,PyDict 长得确实是挺像 JSON 的。

比如这种:

1
{'foo': 'bar'}

把单引号全换成双引号就可以解析了,这样子:

1
JSON.parse("{'foo': 'bar'};".replace(/\'/g, '"'))

但是,要是遇到带 Unicode 的,比如:

1
{'\\xe9\\x94\\x99\\xe8\\xaf\\xaf': '\\xe4\\xbd\\xa0\\xe4\\xbb\\xac\\xe5\\x86\\x8d\\xe8\\xaf\\xb4 Python Dict \\xe5\\xb0\\xb1\\xe6\\x98\\xaf JSON \\xe6\\x88\\x91\\xe5\\xb0\\xb1\\xe6\\x97\\xa5\\xe6\\xad\\xbb\\xe4\\xbd\\xa0\\xef\\xbc\\x81\\xe5\\x93\\xbc\\xef\\xbc\\x81'}

就木有办法了,也许有人说。。。有!我把 \xb1 什么的自己处理掉!

好吧这是一种办法,但是我用了更蛋疼的方法,直接用 C艹 写了个库,把 PyDict 用 Python 转成 JSON 然后 JSON.parse 之。。。

由于学艺不精,写这个库的时候 Segment fault 数次,还曾有各种内存泄露。

嗯,不过总算是写完了。

Github 地址在这里: https://github.com/ym/node-pydict

要用的话直接 npm install pydict 就可以安装了。

1
2
var pydict = require('pydict');
console.log(pydict.parse("{'\\xe9\\x94\\x99\\xe8\\xaf\\xaf': '\\xe4\\xbd\\xa0\\xe4\\xbb\\xac\\xe5\\x86\\x8d\\xe8\\xaf\\xb4 Python Dict \\xe5\\xb0\\xb1\\xe6\\x98\\xaf JSON \\xe6\\x88\\x91\\xe5\\xb0\\xb1\\xe6\\x97\\xa5\\xe6\\xad\\xbb\\xe4\\xbd\\xa0\\xef\\xbc\\x81\\xe5\\x93\\xbc\\xef\\xbc\\x81'}"));

PS: 虽然我吐槽了很多次但是我还是要再吐槽一遍!!!研发的亲们!!!你们能不能不要再告诉我 PyDict 就是 JSON 了啊啊啊!!!

再 PS: 困死我了居然还睡不了因为今天是 Deadline … 哼哼哼下次再乱改需求就不干了!!!

由于在我的生产环境中又 Segfault 了 … 于是我用了一种 很黄很暴力 的方法

1
2
3
4
5
6
7
8
9
10
11
12
var pydict = function(str) {
/* drop all unicode string */
str = str.replace(/(\\x[0-9a-f]{2})/g, function() { return '' }).replace(/\'/g, '"');

try {
str = JSON.parse(str);
} catch(e) {
return false;
}

return str;
}

嗯… 反正我也不用那堆中文…