V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
18510047382
V2EX  ›  JavaScript

PowerJSON - 由 JSON 改进的数据交换格式。

  •  
  •   18510047382 · 2019-10-15 14:35:13 +08:00 · 9053 次点击
    这是一个创建于 1873 天前的主题,其中的信息可能已经有所发展或是发生改变。

    PowerJSON

    Powerjson 是由 JSON 改进而成的数据交换格式,它将 JSON 支持了部分 JavaScript 语法,使其更加高效可用,并且解决了许多 JSON 历史遗留下来的问题。

    它支持 单引号字符串, 多行字符串, 注释, 运算符, 导入文件, 导入其它 PJSON 文件 等。

    Simple Demo

    {
        // 字符串
        helloText: 'hello world',
        MultiLineText: `
            Welcome
            to
            PowerJSON!
        `,
    
        // 文件和导入
        myFile: new File('./file.txt'),
        importPJSONFile: new PJSON('./index2.pjson'),
        getFile: new GET('http://cn.powerjson.org'),
    
        // 运算符
        tenDaySeconds: 60 * 60 * 24 * 10
    
        // 这里是注释!
        /* 注释 2 */
    }
    

    生态系统

    聊天室 Gitter

    为什么不加入我们的在线 PowerJSON CN Gitter 聊天室

    仓库

    PowerJSON 在 Github / Gitee / NPM 上托管仓库。

    兼容性

    PowerJSON 支持所有兼容 ES6浏览器 / js 运行时

    浏览器:

    • IE >= 11
    • Edge All
    • Firefox >= 6
    • Chrome >= 21
    • Safari >= 7.1
    • Opera >= 15

    Node.js:

    • Nodejs >= 6

    文档

    访问 powerjson.org 查看我们的在线实例和 教程

    变更日志

    每次发行版的细节和变更记录请访问 Github 上的 发行日志

    协议

    MIT

    Copyright (c) 2019-present, Yingxuan (Bill) Dong

    1  2  
    blanu
        1
    blanu  
       2019-10-15 14:39:18 +08:00 via iPhone
    数据交换不仅仅要考虑 JS,没有其他语言很难用上,而且你这种语法在很多语言里根本无法实现
    18510047382
        2
    18510047382  
    OP
       2019-10-15 14:45:02 +08:00
    @blanu 为什么语法在别的语言就无法实现?请你详细说说
    Hanggi
        3
    Hanggi  
       2019-10-15 14:47:58 +08:00
    @18510047382 人家的意思应该是没有看起来那么好吧?
    18510047382
        4
    18510047382  
    OP
       2019-10-15 14:56:07 +08:00
    @Hanggi 我其实感觉这里面的语法都是通用的,注释、new、字符串等等等在许多语言的书写方式都是一样的
    telung
        5
    telung  
       2019-10-15 15:01:24 +08:00   ❤️ 2
    JSON 支持文件导入有什么鬼用?你给大家解释一下
    chendy
        6
    chendy  
       2019-10-15 15:03:45 +08:00
    看了下楼主的发帖纪录…造轮爱好者啊…
    markgor
        7
    markgor  
       2019-10-15 15:08:26 +08:00
    我再 chrome 的 console 試了下:
    console.log({
    // cmd 123123
    helloText:'abcdefg',
    mlText:"asdf\nasdf",
    /*testtest*/
    abc:123,
    tst:1*2*3*4
    });

    返回:
    abc: 123
    helloText: "abcdefg"
    mlText: "asdf↵asdf"
    tst: 24
    __proto__: Object


    請問為什麼需要用 PJSON ?

    我直接用 JSON 他不香哦
    ----------------------------------
    然後看到你說的數據交換,
    也看了你的文檔和說明,
    但未找到具體怎麼轉換。
    所以想問問你交換的時候他是怎麼交換?




    另外,最實際的一個問題,

    在 JS 裡,我 var a={xxx:123}就是 JSON 對象了,直接 ajax 就提交去後端了,
    在 php 裡我使用 json_encode(array);就能輸出 JSON 對象,JS 直接就能使用了,
    在 C#裡我引用個 fastJson 就可以了。

    請問如果替換成 PJSON,對我而言是簡化了哪裡呢?
    18510047382
        8
    18510047382  
    OP
       2019-10-15 15:10:26 +08:00
    @telung 实现模块化
    hiluxi
        9
    hiluxi  
       2019-10-15 15:12:22 +08:00
    术业有专攻,json 就是用来存储数据的,何必多此一举在里面搞编程语言支持呢?
    dyllen
        10
    dyllen  
       2019-10-15 15:14:02 +08:00
    json 不就为了简单吗?搞这么复杂。。。
    18510047382
        11
    18510047382  
    OP
       2019-10-15 15:16:17 +08:00   ❤️ 1
    @markgor 首先 JSON 是不支持 comment、运算符等等的,你所使用的是 JavaScript 对象,并不是严格的 JSON,推荐你看看 json.org 的一些规范,如果你用你把你刚才 object 转换成字符串,再用 JSON.parse 解析会解析不了的。
    JSON.parse(`
    {
    // cmd 123123
    helloText:'abcdefg',
    mlText:"asdf\nasdf",
    /*testtest*/
    abc:123,
    tst:1*2*3*4
    }
    `)
    直接报错:VM75:3 Uncaught SyntaxError: Unexpected token / in JSON at position 3
    at JSON.parse (<anonymous>)
    at <anonymous>:1:6

    另外你说的 ajax 提交是不能直接提交 JavaScript Object 的,他需要使用 JSON.stringify 转换成字符串才能通过 GET、POST 请求发送,而你刚才的那些代码是没办法转换成 json 字符串的
    18510047382
        12
    18510047382  
    OP
       2019-10-15 15:19:03 +08:00
    @dyllen 推荐你先掌握一下注释等等的重要性,这对个人来说不写注释可能没什么,但是对团队来说注释是非常重要的,而 json 不支持注释等等内容,对团队协作是非常不方便的
    18510047382
        13
    18510047382  
    OP
       2019-10-15 15:19:35 +08:00
    @hiluxi 推荐你也先掌握一下注释等等对团队协作的重要性
    angusun
        14
    angusun  
       2019-10-15 15:20:40 +08:00
    没有 get 到痛点,所以也无法知道是否变得更好用了。
    blackcurrant
        15
    blackcurrant  
       2019-10-15 15:21:49 +08:00
    挺好的,支持这种创新,虽然不一定有卵用。
    18510047382
        16
    18510047382  
    OP
       2019-10-15 15:23:18 +08:00
    @angusun json 还有什么另外的痛点吗?除了 PJSON 改进的这些内容
    markgor
        17
    markgor  
       2019-10-15 15:23:21 +08:00
    JSON 是不支持 comment、运算符等等的,你所使用的是 JavaScript 对象
    如果你用你把你刚才 object 转换成字符串,再用 JSON.parse 解析会解析不了的。
    請問 PJSON 是不是也是 JS 對象?
    PJSON.parse(PJSON.stringify({
    /*asdfasdf*/

    a:1
    }));

    請問結果是什麼?


    另外你说的 ajax 提交是不能直接提交 JavaScript Object 的,他需要使用 JSON.stringify 转换成字符串才能通过 GET、POST 请求发送,而你刚才的那些代码是没办法转换成 json 字符串的

    var a = {
    // cmd 123123
    helloText:'abcdefg',
    mlText:"asdf\nasdf",
    /*testtest*/
    abc:123,
    tst:1*2*3*4
    };
    var b= JSON.parse(a);

    ajax 提交這個 b 可以了吧?
    但是 PJSON 是可以簡化哪一步呢?

    還有各種語言對 JSON 的支持和支持庫你也可以上 json.org 看看。
    如果換成 PJSON,請問支持庫是有...?


    最後一問,
    文檔中說 PJSON 最厲害是加入了運算支持,
    請問可以把 JS 的計算精度問題修復下嗎?

    PJSON.stringify({a:0.1+0.1+0.1});
    "{"a":0.30000000000000004}"
    18510047382
        18
    18510047382  
    OP
       2019-10-15 15:26:21 +08:00
    @markgor pjson 简化的是 parse 的步骤,是通过字符串解析成对象的步骤,而你说的都是 stringify 的东西,这些东西并没有必要简化啊。

    另外推荐你先学好基础,你的:

    var a = {
    // cmd 123123
    helloText:'abcdefg',
    mlText:"asdf\nasdf",
    /*testtest*/
    abc:123,
    tst:1*2*3*4
    };
    var b= JSON.parse(a);

    执行之后报错:

    VM199:1 Uncaught SyntaxError: Unexpected token o in JSON at position 1
    at JSON.parse (<anonymous>)
    at <anonymous>:9:13

    应该是 var b = JSON. stringify(a)
    18510047382
        19
    18510047382  
    OP
       2019-10-15 15:26:39 +08:00
    @blackcurrant 试试就知道了嘛
    markgor
        20
    markgor  
       2019-10-15 15:31:28 +08:00
    @18510047382 简化的是 parse 的步骤,parse 哪裡簡化了,
    另外可以不要避重就輕,回答下嗎。

    看完你的文檔和你所說的東西,
    我是真的不知道究竟能幫我減少什麼工作?
    或者是不知道哪個地方可以使用它?
    你可以參考上面別人的回復,
    你可以明確的說出使用上它,在哪些地方是方便了?或者舉個實例也好啊
    imdong
        21
    imdong  
       2019-10-15 15:31:52 +08:00
    等等,大家的 JSON 都不是机器生成的么?
    为啥我都是 obj to json_str // json_str to obj
    18510047382
        22
    18510047382  
    OP
       2019-10-15 15:32:17 +08:00
    @markgor PJSON 解析器是基于 JavaScript 的,该如何修复 js 的计算精度呢?
    18510047382
        23
    18510047382  
    OP
       2019-10-15 15:32:58 +08:00
    @imdong Node.js 还是 jsonstr to obj 多,browser 基本用不到啊
    imdong
        24
    imdong  
       2019-10-15 15:34:38 +08:00
    @18510047382 那为啥需要注释?
    难道 JSON 需要自己手动写?
    注释不应该用在生成 obj 的代码里面吗?
    markgor
        25
    markgor  
       2019-10-15 15:35:26 +08:00
    @18510047382
    引用自百度出來的:
    们要把需要计算的数字乘以 10 的 n 次幂,换算成计算机能够精确识别的整数,然后再除以 10 的 n 次幂,大部分编程语言都是这样处理精度差异的,我们就借用过来处理一下 JS 中的浮点数精度误差。
    18510047382
        26
    18510047382  
    OP
       2019-10-15 15:35:54 +08:00
    @markgor json 的 parse 加不了 comment、operator、file data 等等,所以这就是 pjson 的特殊之处。
    另外 pjson 的用处主要就是在 node.js 方面的,browser 如果你需要解析 jsonstr 可以使用 pjson。
    18510047382
        27
    18510047382  
    OP
       2019-10-15 15:37:10 +08:00
    @imdong 我不知道你究竟见过 .json 文件没有,当 json 作为配置文件来使用的时候,你怎么通过 javascript 生成呢?
    18510047382
        28
    18510047382  
    OP
       2019-10-15 15:38:00 +08:00
    @markgor 你说的精度处理也不错,之后考虑加入一下
    markgor
        29
    markgor  
       2019-10-15 15:39:45 +08:00
    @imdong Node.js 的配置文件是手寫的。

    @18510047382
    說真的,我們大家看完一大堆東西,
    都不知道究竟用這個替換成 JSON 後能減輕或幫助到我們什麼東西,
    這個點我覺得你應該說說比較好。

    另外我不知道別人為什麼用 JSON,
    我知道的就是我自己為什麼用 JSON。

    就如上面所說,
    因為 PHP 直接用 JSON_ENCODE(array|object)它就返回了 JSON
    JS 只要是 ajax 設置了 JSON 類型就自動解析出 JS 對象。
    換成.NET,JAVA 也是如此,只是它們需要加載第三方包。

    然後傳輸中的對象就像你所說的,它們屬於 string 類型。那請問 PJSON 傳輸時候是否也是 STRING 類型呢?
    momocraft
        30
    momocraft  
       2019-10-15 15:41:52 +08:00
    作为“交换格式”可能不容易普及,作为预处理器可能有用
    JounQin
        31
    JounQin  
       2019-10-15 15:42:00 +08:00 via iPhone
    这轮子不香,下一个。
    czjxy881
        32
    czjxy881  
       2019-10-15 15:42:51 +08:00
    数据和代码耦合,很容易出现安全漏洞
    love
        33
    love  
       2019-10-15 15:45:31 +08:00
    导入文件啥的真没有必要,而且这种其它语言也不好支持

    你可以参考 Node 社区常用的做法,比如需要导入文件 /计算之类的场合可以写成.js 模块,并导出一个最终 JSON,不比你这种做法妥当且灵活得多啊
    love
        34
    love  
       2019-10-15 15:46:08 +08:00
    去掉了导入的话和常用的 json5 之类的就没区别了,所以这个轮子真没必要
    Jirajine
        35
    Jirajine  
       2019-10-15 15:48:53 +08:00 via Android
    起码楼上说的有一个问题需要解决:各种常用语言的支持库。
    zhybb2010
        36
    zhybb2010  
       2019-10-15 15:53:00 +08:00
    json 本身不是为了压缩或者序列化对象使用的么。。这么搞把它反而复杂化了。。况且除了感觉对于前端有用,后端就太鸡肋了,也不知道有没有 XSS 的风险
    ipwx
        37
    ipwx  
       2019-10-15 15:53:09 +08:00
    配置文件,Node 系直接用 .js ,其他系用 YAML。

    数据交换( API ),根本不需要这么复杂的功能。

    结论:毫无意义。
    cheneydog
        38
    cheneydog  
       2019-10-15 15:56:07 +08:00
    new 可以去掉吧,感觉多余。
    二进制数据支持么?
    zhuangzhuang1988
        39
    zhuangzhuang1988  
       2019-10-15 16:00:25 +08:00
    试试 jsonnet 呗
    http://www.lihaoyi.com/post/BuildyourownProgrammingLanguagewithScala.html 这里还有个简单的 scala 怎么实现教程
    pkoukk
        40
    pkoukk  
       2019-10-15 16:06:26 +08:00
    额..一时语塞不知道怎么说
    请问您的 powerJson 目前支持哪些语言呢?如果只支持 js 的话,我为什么不用.js 呢
    18510047382
        41
    18510047382  
    OP
       2019-10-15 16:15:57 +08:00
    @love json5 是 es5 的 json,而 powerjson 有部分 es6 的语法,包括多行字符串等等,更主要的是维护的都是中国人,中文随时可以提 issue,另外这个导入文件的功能把他变成一个模块我觉得挺不错的,之后看看能不能实现 :)

    @markgor 我现在都不知道你到底在问什么,pjson 解析器能把 pjson 的特殊语法转换成纯 js 对象,pjson 主要就是针对配置文件使用的,pjson 就是给.json 文件提供一些例如注释之类的功能。pjson 文件传输的时候只需要传输 pjson 字符串就行了啊,然后你在接收端使用 pjson.parse 解析,这也有问题?另外我觉得我已经和你说的够多了,再有问题我也不会回复了。

    @czjxy881 这个都是我们自己写的解析器,并没有 eval 或 new function 之类的东西,安全性应该还是有保障的,不过现在还是 alpha 版本,不推荐生产环境使用

    @Jirajine 这个之后也会解决的,我们会慢慢实现

    @zhybb2010 json 是传输数据使用的,如果你喜欢简单的 json 也是可以的,powerjson 就是在 json 的语法基础上扩展的,所以并不代表你必须要使用 powerjson 语法。

    @cheneydog new 的话是为了更符合 js 语法。另外二进制目前还不支持,之后考虑添加

    @ipwx 我不知道你在哪里得出来的这个结论,你说的“数据交换( API ),根本不需要这么复杂的功能”可以解释一下为什么不需要吗?

    @zhuangzhuang1988 感谢你的 scala 教程,另外 jsonnet 是一个 json 模板引擎,并不是编程语言啊

    @pkoukk 现在因为还是 alpha 版本,所以只支持 js,不过之后会支持更多的语言
    mcfog
        42
    mcfog  
       2019-10-15 16:28:53 +08:00   ❤️ 5
    数据交换和配置管理是非常不一样的两类需求,数据交换优先的是机器可读和性能,可选的是人类可读,没用的是容易编写,因为数据交换的主要场景是从内存 serialize 而不是手写。而配置管理重要的易编写和人类可读,机器可读其次,性能基本没用除非烂到不可理喻。

    你说了是数据交换格式,然而你的 feature list 里面大于 json5 的部分基本都和数据交换无关,而是配置管理的需求,这些需求对于数据交换来说都是无用的复杂性而已( client 发了个 pjson 给 server,结果 server 还要再请求远程文件才能获取完整结构?安全性和性能都完蛋,更别说 include 本地其他文件了)

    看你一直在说注释重要和手写配置,那么反过来说如果你的项目目的是配置管理,那 json 就根本不是一个好的(不如说是最糟糕的)学习对象,建议看(学)看(习) toml 这种更现代的配置语言

    还有,我讨厌这种回复每楼说你不懂其实我的东西很牛逼的楼主,如果楼主你回复我请做好被无视的心理准备
    Jirajine
        43
    Jirajine  
       2019-10-15 16:31:00 +08:00 via Android
    @18510047382 恩,处理库,ide 的高亮语法检查格式化插件等有了之后换过来用还是不错的,既然完全兼容 json,并解决了配置文件注释这样的痛点,不妨不要改扩展名,直接用 json 好了。

    可以用 base64 加入二进制文件支持?

    还有我也支持把 new 去掉,键值对的关系这样搞得莫名其妙。
    18510047382
        44
    18510047382  
    OP
       2019-10-15 16:32:44 +08:00
    @mcfog 是的,这里手误写成了数据交换格式,实际上是数据格式,不好意思。(另外我也不是这种 “回复每楼说你不懂其实我的东西很牛逼” 的人,只是这里键盘侠太多了,我十分反感这种人,但是你正常提意见还是没有问题的)
    18510047382
        45
    18510047382  
    OP
       2019-10-15 16:35:17 +08:00
    @Jirajine 嗯嗯,json 这名字人家是有版权的,咱就别用了。另外二进制功能我们慢慢实现,new 的话到时候发布正式版了再去解决。
    xiangyuecn
        46
    xiangyuecn  
       2019-10-15 16:48:48 +08:00
    这种只能用来单向传输的(并且只能传给支持 js 的环境),欢迎使用 eval 大法,抛开安全性,不仅支持注释,不仅支持运算,还支持传输函数哟,甚至直接调用函数的函数的函数的运算,说白了上就等同于一个 js 文件,另外用函数包裹一下用来支持序列化;浏览器支持:IE6+ 😎

    觉得蛮好玩,就手撸了一段 js 代码,就是不知道有没有什么实用价值😂😂😂



    附无格式可 copy 代码:
    Serialize:
    ``` javascript
    data=function(){
    return {a:/abc//*正则*/,b:Math.pow(2,8)/*指数运算*/,c:[4,5,6]}
    };
    /*stringify*/(data).toString()
    ```
    Deserialize:
    ``` javascript
    data="function(){\nreturn {a:/abc//*正则*/,b:Math.pow(2,8)/*指数运算*/,c:[4,5,6]}\n}";
    /*parse*/eval("EvalTemp=("+data+");EvalTemp");
    ```
    markgor
        47
    markgor  
       2019-10-15 16:51:54 +08:00
    @18510047382
    我现在都不知道你到底在问什么,pjson 解析器能把 pjson 的特殊语法转换成纯 js 对象,pjson 主要就是针对配置文件使用的,pjson 就是给.json 文件提供一些例如注释之类的功能。pjson 文件传输的时候只需要传输 pjson 字符串就行了啊,然后你在接收端使用 pjson.parse 解析,这也有问题?另外我觉得我已经和你说的够多了,再有问题我也不会回复了。

    你是覺得數據交換就是用 NODE.JS 讀取個配置嗎?
    你權當我不懂你們前端的思維。
    數據來源要麼是手動寫死,要麼是數據庫取值,
    排除手動寫死的,哪個數據庫支持 PJSON 格式?是需要轉換成 JSON 入庫嗎?
    簡單的數據傳輸:
    後端->前端
    使用 JSON 前:
    把後端的對象或數組轉換成 JSON 傳輸 給前端,前端直接解析就成了前端的對象 /數組。大家圖個方便。

    換成 PJSON 後:
    後端:到處找對應語言的解析庫,發現沒有,然後口中念念叨叨地不知道說著什麼邊模仿著 JS 源碼來處理。
    前端:找到庫了,在每個使用的地方加載下再使用再解析傳回來的 JS。
    運維:看著傳輸中數據的注釋和未經計算的固定數字公式陷入了沉思,無奈地看下監控中的 Netflow 和顯示器下面擺放著領導給的帶寬使用情況,不禁地思考起來,前端的輪子永遠都是那麼樸實無華,且鼓譟。

    最後,回不回復是您的權利,不過看了下你 github 上的所有輪子,裡面 issue 都是空白的,不回復我您不覺得空虛無聊冷嗎?
    18510047382
        48
    18510047382  
    OP
       2019-10-15 16:52:23 +08:00
    @xiangyuecn Eval 安全性不高,另外我们未来还会开发 Java、Python 等其他版本的编译器
    18510047382
        49
    18510047382  
    OP
       2019-10-15 16:55:07 +08:00
    @markgor 你怎么样认为随你好吧?你见过新东西一发生态就这么丰富的?
    18510047382
        50
    18510047382  
    OP
       2019-10-15 16:59:34 +08:00
    @markgor 算了,我好好地和你说吧:
    1. PJSON 入库可以直接当做字符串入库
    2. 后端语言的 Node.js 已经有对应的 PJSON 解析器了,Java、Python 等等的其他语言我们现在也正在开发。
    另外如果你觉得我们做的不好,那你至少给出点建议吧。
    iRiven
        51
    iRiven  
       2019-10-15 17:01:23 +08:00   ❤️ 3
    我还以为那个男人换了个马甲回来了
    lcvs
        52
    lcvs  
       2019-10-15 17:01:34 +08:00
    注释和运算符功能有些用处,其他功能比较特殊,使用频次不高,应该不常用;其实注释功能在当前的 json 上,也可以用另一种机智的方式实现,就是加一组用于注释的 key: value = =
    FrankHB
        53
    FrankHB  
       2019-10-15 17:04:15 +08:00
    @mcfog 关于你所谓的对数据交换的主要场景的理解,基本是不靠谱的。
    任何足够成功的二进制中立的语言中间表示,特别是捆绑了标准内部和外部表示的方案,都算是你的理解的反例,如 LLVM IR 和 FASL(Lispwork's Fast Load format) 。而没有标准内部表示但比较容易实现的更通用的格式,如 XML 和 S-expression,也可以构成反例。
    从实现功能上来讲,serialize 比起 marshall 来讲基本是伪需求。造成 serialize 算是个事儿的历史原因主要是,使用 ALGOL-like 这样的传统命令式语言的用户很少能想清楚先天就能 serialize 的格式该怎么设计,历史上一路上都在从实现开始试错而不会去先排除根本困难,所以传统上才会过分强调这个问题;然而对成熟的、一开始搞清楚什么应该是从被交换的数据里剔除出去的方案,这里根本就不应该有什么原则难度。Marshall 才真正涉及一些和结构以及具体目标语言的语义相关的麻烦事。
    配置管理跟数据交换来讲,与其说是非常不一样,不如说是根本不算是应该在一个层次上实现支持的功能。配置管理是更高层的应用。(和数据交换同级别的应用是直接的可编程性,但这在非同像性的(homoiconic) 语言的时候基本没什么意义。)配置管理的基本表达就是可编程的数据,它也可以被交换;反过来可交换的数据就不一定需要能被可交换的外部格式表达。所以这个问题的结论上我倒是没什么根本不同的意见——LZ 的设计基本意义上不大。
    不过 TOML 这类 DSL 还是算了吧,随便都能糊,没人用就没人权。
    18510047382
        54
    18510047382  
    OP
       2019-10-15 17:06:48 +08:00
    @lcvs 对,但是这种 key: value 形式的注释容易让人当成字段解析
    ydsq
        55
    ydsq  
       2019-10-15 17:09:47 +08:00
    楼主造轮子精神我很佩服,但很明显是不会成为数据传输规范的,也不会有太多人认可
    bojackhorseman
        56
    bojackhorseman  
       2019-10-15 17:09:48 +08:00
    @iRiven #51 json pstd
    danielmiao
        57
    danielmiao  
       2019-10-15 17:10:13 +08:00
    搞这么复杂,我为啥不用 XML ?为了解决 XML 的复杂性,搞出的 JSON,然后一个轮回又回去了??
    3dwelcome
        58
    3dwelcome  
       2019-10-15 17:12:09 +08:00
    个人感觉语法可以和 sql 结合一下,楼上有人说的很对,大部分数据都是查数据库,如果 json 有数据查询和数据校验功能,肯定强很多。
    18510047382
        59
    18510047382  
    OP
       2019-10-15 17:12:43 +08:00
    @danielmiao pjson 只是提供更多选择,你并非必须使用 pjson 提供的语法
    18510047382
        60
    18510047382  
    OP
       2019-10-15 17:13:55 +08:00
    @3dwelcome 可以的,未来可以支持一下 SQL :)
    mcfog
        61
    mcfog  
       2019-10-15 17:17:38 +08:00
    @FrankHB 抱歉基本没看懂你在说啥,如果你觉得 toml 还不够好,可以举一些你觉得比 toml 优秀的方案来让大家学习一下么?
    q4336431
        62
    q4336431  
       2019-10-15 17:19:15 +08:00
    为啥不用 yaml 呢
    markgor
        63
    markgor  
       2019-10-15 17:23:43 +08:00
    @18510047382
    可能大家遇到的需求並不相同,或者並不在同一個頻道對答。
    老實說我關注的只是數據交換這一塊,你可以看回我之前的回復,都是基於這一塊出發的。
    另你所說的字符入庫,的確是可以這麼幹,而且這麼幹絕對能把 DBA 干死。
    最後,我沒有任何不支持“新”事物的觀點,也知道並非所有新東西一發生周圍市場就能豐富起來。
    但我覺得最直觀的就是
    1、我為什麼要把 JSON 換成 PJSON ;
    2、我換成 PJSON 後我是能縮短或增便了什麼;
    3、我把現成項目改用 PJSON 後需要多少時間;

    我不是專門和你缸,看了你回復別人的信息也大概清楚。(#44 手误写成了数据交换格式,实际上是数据格式,不好意思。(另外我也不是这种 “回复每楼说你不懂其实我的东西很牛逼” 的人,只是这里键盘侠太多了,我十分反感这种人,但是你正常提意见还是没有问题的))

    你所說的“这里键盘侠太多了,我十分反感这种人”,裡面應該包含我吧。
    我不知道是因為我的提問字眼太尖銳了讓你難入耳還是怎樣,
    真心希望你能把我回復從頭看一次,我的著重點是“數據交換”,我看完你所有介紹及回復你都沒說到交換時候如何便捷或特點。
    337136897
        64
    337136897  
       2019-10-15 17:26:14 +08:00
    好像很吵。。。
    但是好好的 json 被搞得那么复杂。。。也是醉了
    duanxianze
        65
    duanxianze  
       2019-10-15 17:44:24 +08:00
    虽然很炫酷 但说实话并没有解决痛点,例如注释,运算符本就不该是 json 应该包含的东西,json 是用来传输的,越精简越好
    youxiachai
        66
    youxiachai  
       2019-10-15 17:48:46 +08:00
    为啥不用 pb.....
    pb 现在也可以直接转 json....注释什么的写在 pb 上就好...
    还可以多语言协作....
    FrankHB
        67
    FrankHB  
       2019-10-15 17:51:39 +08:00
    @mcfog 你所谓好不好,是看应用场景而定的。这本身没什么问题:大部分人用某个语言解决配置问题,就只是把配置当 DSL 的代码来用。这种情况的前提是,别人替你把资源准备好了,告诉你足够靠谱,只管用就行。
    但是要考虑更一般的情形就不是这么一回事了。没什么 DSL 能 hold 住各种不同的需求,整体上要造不同 DSL 的轮子方案数量都会爆炸。还可能有一坨方案的实现都根本不值得信任,搞不好需要自己实现整个“生态”的时候。最极端的情况下,编程语言我都需要自己造轮子,一个只能用于配置的 DSL ?写 spec 和实现都就是增加工作量。
    考虑一下 JSON 的流行,本身就有这个背景。JavaScript 的设计是否干净得配得上被当成一个通用程序语言不说,好歹很多人就是拿它当通用语言来用的。JSON 作为 JavaScript 的缩水版,并不需要很多单独的设计,只要附加一些约定一个 spec 就出来了。这里 JavaScript + JSON 就显然比 JavaScript + TOML 或者其它什么别的省事。考虑实现,JavaScript 和 JSON 本身语法非常接近,所以很多设施都能够方便地复用。这进一步形成正反馈,让用户有很多途径找到可用的使用的 JSON 的解决方案。这里,有个足够流行的爹( JavaScript )就是 JSON 先天强势的主要理由,并不需要 JSON 自己的设计就有多“好”。(当然,JSON 的设计如果烂到让人受不了那肯定也是会在流行上减分的,但至少现在没到这个地步。)
    相比之下,TOML 并没那么个好爹。TOML 本身的设计,溯源起来基本也就反映了 .INI ,并没什么很抓人眼球的创新。容易手写和不太难阅读是它的优势,但也仅止于此,能达到这个水平的其它的备胎多得是。要说包装结构化数据使其便于被可编程地处理,连 JSON 其实都打不过,所以它也就只能作为配置 DSL 来生存。TOML 的流行(如果算流行的话)主要是近些年 Cargo 之类的项目实际被广泛使用——也并不是因为它的设计有先进,只是恰好在这类项目中被人认为足够合适而已——这至少需要偶然到接触到它的人找不到其它更好的方案(挺难的)。尽管如此,仅在手写配置这个领域中想跟 JSON 竞争流行性,仍然是想多了。(手写 JSON 起码还没像 XML 那么容易烦躁到忍不了。)
    考虑到 DSL 脱离具体领域无法互相比较,真正凭自己的设计算得上“好”的格式就不可能只能当 DSL。这部分其实 JSON 也不太够格,因为它的爹仍然有很大的领域局限性,脱离群众基础没什么现成的解决方案想自己从头造,一样分分钟缩卵。考虑通用性,这里有候选资格的大概只有 XML 和 S-expression,两者至少技术上都足够作为一系列通用编程语言的语法基础,也有不止一个例子。不过前者的祖辈(SGML) 历史包袱实在太混乱了,也没发展出个能把事情做干净的直系长辈和儿子(基于 XML 的编程语言实用上几乎全止步于 DSL );后者的历史太乱,到处是精神祖宗和孙子,然而就没什么直接标准化成功的方案(最像样的可能还是跟 XML 杂交的)。所以你要好的就自己搞自己的生态,要流行就别多想了。
    renothing
        68
    renothing  
       2019-10-15 17:57:45 +08:00
    太鸡肋。。。小的 json 不需要注释,命名就能看出作用。而大的 json 都是靠代码自动生成。。。注释自然到代码里去了。。
    whileFalse
        69
    whileFalse  
       2019-10-15 18:09:07 +08:00
    其他都还好,扯淡的是那个读文件功能。一个包含文件引用的 PJSON 被传输到别的地方,或者目录变更,或者分发到其他后端实例上时,解析直接报错,那不废了么。

    YAML 了解一下吧,支持多行字符串和注释,支持很多高级功能,扩展也容易。
    ai277014717
        70
    ai277014717  
       2019-10-15 18:24:48 +08:00
    json 的主要问题不是类型和注释吗?搞这么复杂。直接用 js 多好。
    hang333
        71
    hang333  
       2019-10-15 18:26:10 +08:00
    即将引进一堆安全漏洞
    locoz
        72
    locoz  
       2019-10-15 18:36:21 +08:00
    单引号字符串、多行字符串、注释,这几个挺好的,如果喜欢拿 JSON 这种格式的方式写配置文件的话,有这种功能会很舒服(虽然实际上注释能被部分 JSON 解析器自动忽略)。
    然后运算符、导入文件、导入其它 PJSON 文件这几个功能...怎么说呢...用途比较小吧?某些场景下确实会很方便,但是毕竟比较冷门,平时这种东西就是增加不稳定性的...
    repus911
        73
    repus911  
       2019-10-15 18:38:14 +08:00
    好样的,我等一个 Go/ruby/python/php...的实现
    18510047382
        74
    18510047382  
    OP
       2019-10-15 19:04:53 +08:00
    @markgor 不好意思,这里面确实是我的失误,写成了数据交换格式,实际上 pjson 还是更加适合做配置文件的。
    下面回答下你的几个问题:
    1. 将 json 换成 pjson 可以允许注释、多行字符串等等的存在,让你更方便书写
    2. 你换成 pjson 之后,里面的 new file 可以允许你方便地引用其他文件、new import 可以允许你导入其它配置文件,这个作为配置文件应该很好用
    3. 将现有项目改成 pjson 几乎不需要时间,pjson 完全支持全部的 json 语法,另外你也可以用 pjson 解释器来解析 json 文件
    祝你好运!
    18510047382
        75
    18510047382  
    OP
       2019-10-15 19:05:29 +08:00
    @duanxianze 嗯,我这个作为配置文件是很好用的
    18510047382
        76
    18510047382  
    OP
       2019-10-15 19:06:14 +08:00
    @locoz new file,new import 作为配置文件很好用,如果你需要传输的话可以不使用这几个功能,单纯使用字符串、注释即可!
    Jirajine
        77
    Jirajine  
       2019-10-15 19:06:22 +08:00 via Android
    @18510047382 版权问题不太清楚,不过这属于模块的实现吧,很多用 json 作为配置文件的软件是支持注释的,这是否构成侵权?

    我的意思是作为原 json 的超集完全向下兼容,将 json 模块换成你的以后觉得不好的不需要的特性完全可以不用,而你这些增强主要是解决配置文件的痛点,我知道 json 当配置文件不是最好,但确实很广泛。

    所以还是不建议改名,或者同时也兼容传入.json 文件的解析。
    18510047382
        78
    18510047382  
    OP
       2019-10-15 19:06:58 +08:00
    @whileFalse 读取文件的功能是作为配置文件使用的 :)
    18510047382
        79
    18510047382  
    OP
       2019-10-15 19:09:21 +08:00
    @Jirajine 嗯,pjson 解析器一直都是支持解析.json 文件的,同时你的意思应该是说把 powerjson 解析器模块化吧?这个我们在未来会实现的
    shunia
        80
    shunia  
       2019-10-15 19:10:28 +08:00
    js 生态圈里好多 json 都支持注释了,虽然都是 IDE 级别的实现。
    另外前端生态圈也慢慢的退出 json 配置优先的情景了,基本都是 js 配置优先。


    我觉得做中间件还稍微有点意义-提供成一个解析 pjson 格式的中间件,作为一个 bridge 用。


    手写的话,我永远也不会选择这么复杂的 json 语法的,我用 js 它不香吗?。。。

    如果非要是配置文件,yaml 之类的它不香吗?。。。

    如果数据传输,额外增加了传输的数据量吧,而且还要在前后端各增加一个库,有点多余的其实。
    chennqqi
        81
    chennqqi  
       2019-10-15 19:12:26 +08:00
    JSON5 呢
    Jirajine
        82
    Jirajine  
       2019-10-15 19:14:40 +08:00 via Android
    @18510047382 应该说是作为各语言标准 json 模块的增强的替代品,传到 pypi,npm 等官方源上,并且实现的时候尽量兼容原 json 库的调用方式,方法命名,参数等。
    18510047382
        83
    18510047382  
    OP
       2019-10-15 19:16:10 +08:00
    @Jirajine 对,主要还是看中了 json 的格式
    smilingsun
        84
    smilingsun  
       2019-10-15 22:43:13 +08:00 via Android
    无论好与坏,如果没有单元测试的话,没人敢用。
    efaun
        85
    efaun  
       2019-10-15 23:15:30 +08:00
    这也 80 多个回复了,为什么没人 star 呢,开发者你想过没有
    imNull
        86
    imNull  
       2019-10-15 23:32:06 +08:00 via Android
    关键是推动各个语言去支持吧
    mritd
        87
    mritd  
       2019-10-15 23:59:03 +08:00
    数据格式交换,想弹性我就 选择 xml 了,况且现在 grpc 等 rpc 框架一大把 都已经对交换数据做了处理
    hurrytospring
        88
    hurrytospring  
       2019-10-16 01:03:49 +08:00
    没用
    hurrytospring
        89
    hurrytospring  
       2019-10-16 01:04:08 +08:00
    为了造轮子而造轮子
    xFrye
        90
    xFrye  
       2019-10-16 01:10:39 +08:00
    反正我是不愿意把汤勺用锤子锤扁成锅铲来炒菜,这样煮的饭会更香吗?
    vibbow
        91
    vibbow  
       2019-10-16 02:08:21 +08:00
    xml + xslt 不好用么...
    abc612008
        92
    abc612008  
       2019-10-16 02:17:38 +08:00
    这样很不安全吧。访问任意文件,对任意网站发请求?挖洞人应该非常喜欢这个的(
    huiyifyj
        93
    huiyifyj  
       2019-10-16 03:36:49 +08:00
    json5 的概念扩充化,如楼上所言,存在安全问题的。
    Macolor21
        94
    Macolor21  
       2019-10-16 07:29:45 +08:00
    使用场景在哪里?
    作为数据传输的话,噪音太多。
    dingyaguang117
        95
    dingyaguang117  
       2019-10-16 09:47:57 +08:00
    我看到了 注释这个用处。 但是问题在于生态, 什么时候各种语言的标准库支持了就算是成了。

    这个得有个有权势的机构推动才行
    stevenhawking
        96
    stevenhawking  
       2019-10-16 10:20:42 +08:00
    张口就来的标准 不发表评论
    huiyadanli
        97
    huiyadanli  
       2019-10-16 11:00:46 +08:00
    我想到了 https://msgpack.org/
    It's like JSON. but fast and small.
    kingwl
        98
    kingwl  
       2019-10-16 11:06:23 +08:00
    看了下 用来写配置的话还是可以的
    sleepm
        99
    sleepm  
       2019-10-16 11:14:05 +08:00
    处理的某个需要特殊处理的字段,比如引入 json/4+3 计算,那就特殊处理呗,为啥还加个依赖
    单引号就是找麻烦,标准就是标准,都去执行就行了,偏要加个单引号,没事找事么
    想法不错
    joooooker21
        100
    joooooker21  
       2019-10-16 12:30:31 +08:00
    楼主这个轮子看起来更像是对标 yml 这类,而不是 json。在用于数据交换的这一点上,轻量和简洁我觉得更为重要,楼主的这个不太符合。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2646 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:54 · PVG 18:54 · LAX 02:54 · JFK 05:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.