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

2019-10-15 14:35:13 +08:00
 18510047382

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 */
}

生态系统

聊天室

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

仓库

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

兼容性

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

浏览器:

Node.js:

文档

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

变更日志

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

协议

MIT

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

8773 次点击
所在节点    JavaScript
101 条回复
18510047382
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
2019-10-15 16:28:53 +08:00
数据交换和配置管理是非常不一样的两类需求,数据交换优先的是机器可读和性能,可选的是人类可读,没用的是容易编写,因为数据交换的主要场景是从内存 serialize 而不是手写。而配置管理重要的易编写和人类可读,机器可读其次,性能基本没用除非烂到不可理喻。

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

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

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

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

还有我也支持把 new 去掉,键值对的关系这样搞得莫名其妙。
18510047382
2019-10-15 16:32:44 +08:00
@mcfog 是的,这里手误写成了数据交换格式,实际上是数据格式,不好意思。(另外我也不是这种 “回复每楼说你不懂其实我的东西很牛逼” 的人,只是这里键盘侠太多了,我十分反感这种人,但是你正常提意见还是没有问题的)
18510047382
2019-10-15 16:35:17 +08:00
@Jirajine 嗯嗯,json 这名字人家是有版权的,咱就别用了。另外二进制功能我们慢慢实现,new 的话到时候发布正式版了再去解决。
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
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
2019-10-15 16:52:23 +08:00
@xiangyuecn Eval 安全性不高,另外我们未来还会开发 Java、Python 等其他版本的编译器
18510047382
2019-10-15 16:55:07 +08:00
@markgor 你怎么样认为随你好吧?你见过新东西一发生态就这么丰富的?
18510047382
2019-10-15 16:59:34 +08:00
@markgor 算了,我好好地和你说吧:
1. PJSON 入库可以直接当做字符串入库
2. 后端语言的 Node.js 已经有对应的 PJSON 解析器了,Java、Python 等等的其他语言我们现在也正在开发。
另外如果你觉得我们做的不好,那你至少给出点建议吧。
iRiven
2019-10-15 17:01:23 +08:00
我还以为那个男人换了个马甲回来了
lcvs
2019-10-15 17:01:34 +08:00
注释和运算符功能有些用处,其他功能比较特殊,使用频次不高,应该不常用;其实注释功能在当前的 json 上,也可以用另一种机智的方式实现,就是加一组用于注释的 key: value = =
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
2019-10-15 17:06:48 +08:00
@lcvs 对,但是这种 key: value 形式的注释容易让人当成字段解析
ydsq
2019-10-15 17:09:47 +08:00
楼主造轮子精神我很佩服,但很明显是不会成为数据传输规范的,也不会有太多人认可
bojackhorseman
2019-10-15 17:09:48 +08:00
@iRiven #51 json pstd
danielmiao
2019-10-15 17:10:13 +08:00
搞这么复杂,我为啥不用 XML ?为了解决 XML 的复杂性,搞出的 JSON,然后一个轮回又回去了??
3dwelcome
2019-10-15 17:12:09 +08:00
个人感觉语法可以和 sql 结合一下,楼上有人说的很对,大部分数据都是查数据库,如果 json 有数据查询和数据校验功能,肯定强很多。
18510047382
2019-10-15 17:12:43 +08:00
@danielmiao pjson 只是提供更多选择,你并非必须使用 pjson 提供的语法
18510047382
2019-10-15 17:13:55 +08:00
@3dwelcome 可以的,未来可以支持一下 SQL :)

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

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

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

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

© 2021 V2EX