V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
XadillaX
V2EX  ›  Node.js

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

  •  1
     
  •   XadillaX · 2014-10-22 10:24:52 +08:00 · 4504 次点击
    这是一个创建于 3677 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    11 条回复    2014-10-23 22:50:22 +08:00
    scarlex
        1
    scarlex  
       2014-10-22 10:38:28 +08:00   ❤️ 1
    前两天看到楼主创建了这个repository,原来是用来干这个的~
    XadillaX
        2
    XadillaX  
    OP
       2014-10-22 10:48:42 +08:00
    @scarlex 同事小伙伴貌似有这个需求,然后网上么这种包,然后我就抱着试试看的心态搞了一个 -。 -
    linea
        3
    linea  
       2014-10-22 11:20:41 +08:00
    Mark
    jsonline
        4
    jsonline  
       2014-10-22 11:54:22 +08:00 via Android   ❤️ 1
    有一种纵容的感觉
    XadillaX
        5
    XadillaX  
    OP
       2014-10-22 12:08:53 +08:00
    @jsonline 实际上的需求是——小伙伴请求了个 JSONP,然后想把这个 JSONP 得到的 Object 拿到服务端解析。JSONP 本来就是 js 代码,所以写法当然一般就是不带引号的写法了。
    zzNucker
        6
    zzNucker  
       2014-10-22 12:28:41 +08:00
    吊吊吊吊
    ibudao
        7
    ibudao  
       2014-10-22 12:33:01 +08:00
    虽然需求很小,手写parser没什么问题,不过还是推荐一下pegjs,可读性可维护性要好很多。
    lisposter
        8
    lisposter  
       2014-10-22 13:05:01 +08:00
    大家好,我是那个提需求的
    iwege
        9
    iwege  
       2014-10-22 13:13:15 +08:00
    vm.runInContext 是否可以解决安全问题?
    XadillaX
        10
    XadillaX  
    OP
       2014-10-22 13:43:02 +08:00
    @iwege 我没做过实验,但是我提过效率。然后有人就做了做过实验。

    以下是引用:

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

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

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

    vm模块各个方法之间还不一样,runInNewContext(code,sanbox) 最快 4K ms
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3061 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:51 · PVG 18:51 · LAX 02:51 · JFK 05:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.