面向堆栈的数据交换格式

2017-12-14 17:48:03 +08:00
 sneezry

感觉 JSON 对于低级语言不太友好,尤其是那些对字符串处理能力比较有限的语言。有可能是个重复的轮子,不过我自己没有找到已有的比较好的方案,不过 JSON 的库确实挺全,可以用起来还是多多少少没有高级语言里那么顺手。

所以这个数据格式并没有解决全部问题,但我觉得至少解决了部分问题。

SOON ( Stack Oriented Object Notation )是我参考 JSON 做的轻量级面向堆栈的数据交换格式,面向堆栈意味着它更容易被程序处理,但损失了可读性。

举例子:

有 JSON 字符串[{"key": "value1"}, {"key": "value2"}],相对应的 SOON 字符串为"value1" "key" O1 "value2" "key" O1 A2

程序处理时将 SOON 字符串先以空格拆分,然后建立一个空栈 stack。

  1. "value1"入栈
  2. "key"入栈
  3. O1指令表示目前栈顶的数据是一个对象( Object ),对象包含 1 个成员
  4. 创建一个空对象 obj
  5. "key"出栈作为 obj1 中一个成员的 key
  6. "value1"出栈作为 obj1[key]的值
  7. obj1 入栈
  8. 类似的,"value2" "key" O1创建了 obj2 并入栈
  9. A2指令表示目前栈顶的数据是一个数组( Array ),数组包含 2 个元素
  10. 创建一个空数组 arr
  11. obj2 出栈,并 unshift 进 arr
  12. obj1 出栈,并 unshift 进 arr 13 arr 入栈 14 返回栈顶数据

我用 TypeScript 做了实现来验证想法:https://github.com/Sneezry/StackOrientedObjectNotation

Playground: https://output.jsbin.com/kiyojexico

2294 次点击
所在节点    分享创造
9 条回复
jtn007
2017-12-14 18:25:38 +08:00
Mongo 存储貌似是用的 BSON,也是 JSON 的变种
xqin
2017-12-14 19:13:14 +08:00
有 BUG 去修吧...

````
import {SOON} from './SOON';


var soon = new SOON();


console.log(soon.parse(soon.stringify({test:" O1 "})));

````
MeteorCat
2017-12-14 19:20:51 +08:00
可以尝试下 Google Probuf
xqin
2017-12-14 19:22:18 +08:00
把 O1 改成 O0 parse 之后会得到一个双引号, 原来 的 名字啥 的都没了.
onion83
2017-12-14 19:26:13 +08:00
jadec0der
2017-12-14 20:03:35 +08:00
有意思,会玩
liuweisj
2017-12-15 13:32:13 +08:00
你需要 yaml
fcten
2017-12-15 18:30:09 +08:00
总觉得很熟悉……仔细想了想,这不是后缀表达式么……
sneezry
2017-12-15 18:36:01 +08:00

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

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

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

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

© 2021 V2EX