写了个解析非正常 JSON 字符串的包——fbbk-json

2014-10-22 10:24:52 +08:00
 XadillaX
F[嗶][嗶]k JSON

解析非正常 JSON 字符串的一个包。

安装

$ npm install fbbk-json

使用

这个包只有一个函数:

var fJSON = require("fbbk-json");
fJSON.parse(A_JSON_STRING);

但是

这个包支持如下的 JSON 字符串(即在 javascript 中我们通常申明的样子,没有引号)。

举个栗子

'{"foo": "bar","baz": true}' <-- JSON 和 fJSON 都支持
'{foo: "bar",baz: true}' <-- 只有 fJSON 支持! ٩(๑•̀ω•́๑)۶

所以你可以:

var json1 = '{"foo": "bar","baz": true}';
var json2 = '{foo: "bar",baz: true,c:[]}';

JSON.parse(json1); ///< { foo: 'bar', baz: true }
JSON.parse(json2); ///< SyntaxError: Unexpected token f
fJSON.parse(json1); ///< { foo: 'bar', baz: true }
fJSON.parse(json2); ///< { foo: 'bar', baz: true, c: [] } \(●´ϖ`●)/

仓库地址

https://github.com/XadillaX/fbibik-json

---------------------------------------

之前有人在微博中说了下用 new Function() 把 JSON 字符串嵌进去的做法,并且 jQuery 也是这么做的。

但是这不适合于服务端。

回复@magicdawn:jQuery 数据是自身传过去的,后台给前台的数据通常是安全的,而且本身就是前端执行,就算不安全跟服务端无关。但是在服务端的话,数据一般是前面传过来的,你不能保证安全性,万一一段恶意代码在服务端执行了,你懂的。 //@magicdawn:jQuery就是这样干的... http://t.cn/R7czvF2
4397 次点击
所在节点    Node.js
11 条回复
scarlex
2014-10-22 10:38:28 +08:00
前两天看到楼主创建了这个repository,原来是用来干这个的~
XadillaX
2014-10-22 10:48:42 +08:00
@scarlex 同事小伙伴貌似有这个需求,然后网上么这种包,然后我就抱着试试看的心态搞了一个 -。 -
linea
2014-10-22 11:20:41 +08:00
Mark
jsonline
2014-10-22 11:54:22 +08:00
有一种纵容的感觉
XadillaX
2014-10-22 12:08:53 +08:00
@jsonline 实际上的需求是——小伙伴请求了个 JSONP,然后想把这个 JSONP 得到的 Object 拿到服务端解析。JSONP 本来就是 js 代码,所以写法当然一般就是不带引号的写法了。
zzNucker
2014-10-22 12:28:41 +08:00
吊吊吊吊
ibudao
2014-10-22 12:33:01 +08:00
虽然需求很小,手写parser没什么问题,不过还是推荐一下pegjs,可读性可维护性要好很多。
lisposter
2014-10-22 13:05:01 +08:00
大家好,我是那个提需求的
iwege
2014-10-22 13:13:15 +08:00
vm.runInContext 是否可以解决安全问题?
XadillaX
2014-10-22 13:43:02 +08:00
@iwege 我没做过实验,但是我提过效率。然后有人就做了做过实验。

以下是引用:

“嗯 , 效率是个问题...1W次,vm要9K ms , fbbk-json 30ms , 不能忍...” by magicdown

毕竟在沙箱里面模拟代码执行还是要开销的。
magicdawn
2014-10-23 22:50:22 +08:00
嗯,vm是挺慢的...

测试代码 https://gist.github.com/magicdawn/b9ea7b05c92913da439d 第三楼

vm模块各个方法之间还不一样,runInNewContext(code,sanbox) 最快 4K ms

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/140693

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX