想写一个 JSON 格式转换的工具,各位有什么思路吗?

2018-11-05 11:38:44 +08:00
 glacer

之前有遇到一个将复杂结构的 JSON 给转成另一种结构来使用,写的代码还是有点复杂,于是想到能不能写个工具可以快速实现 JSON 的结构转换。

初步想法:

  1. 解析源 JSON 结构;
  2. 用类似正则的语言描述目标 JSON 的结构;
  3. 结构转换异常分析;
  4. 遍历源 JSON,实现转换。

如何简单地描述目标 JSON 的结构是一个难点,既要完整地表述出目标 JSON 的结构框架,又不能太复杂,否则可能还不如直接代码实现来的快。所以请教下各位有没有什么的好的思路?

1749 次点击
所在节点    问与答
14 条回复
GeruzoniAnsasu
2018-11-05 11:45:04 +08:00
你在说啥。。。几乎所有的编程语言都有将 json 转成本语言便于描述的结构的轮子

你想造个啥
glacer
2018-11-05 11:49:53 +08:00
@GeruzoniAnsasu 举个例子。把{"a": {"b": 1}}转成{"a": [["b",2]]}的格式。
glacer
2018-11-05 11:50:32 +08:00
@GeruzoniAnsasu 写错,转成{"a": [["b",1]]},内容不能改变。
GeruzoniAnsasu
2018-11-05 12:01:43 +08:00
@glacer 意思是比如将 dict 转成 tuple list 之类的这种保持类似结构的转化吗。。。然后还要保证通用性?


我怎么觉得没有通用性呢。。。某个 node 要从 dict 变 list 这种事怎么说得准。。还不如临到用时写个脚本转。。或者跟前后端吵一架来得直接
misaka19000
2018-11-05 12:06:55 +08:00
做词法分析和语法分析就可以了吧,最后修改一下语法树应该就能满足楼主的需求了
feverzsj
2018-11-05 12:08:49 +08:00
意义不明,你要被内部结构序列化成 json,也是可以的
imn1
2018-11-05 12:36:15 +08:00
我还以为 json 转 csv, xml 之类
feiyuanqiu
2018-11-05 12:37:08 +08:00
没必要这么复杂,定义一个源数据类、一个目标数据类和两者的转换类,json 的解析交给 gson 之类的库就行了
GeruzoniAnsasu
2018-11-05 12:39:02 +08:00
暂且先不管具体想实现什么,建议看看 cjson 这种语言本身没什么轮子的实现,思路会比较清晰且通用

比如怎么用通用节点结构来表示数据,cjson 用的是一个包括了所有数据类型的结构来表示节点,然后用一个 type 字段表示.valueint .valuedouble .valuestring .child 等各个字段哪些是有效的,json object 和 array 都统一用单链表表示,这样类型转换的开销也非常小,移动节点也就是移动一下指针的事

需要考虑的最复杂的东西是怎么处理指针的生命周期,怎么保证指针指向结构的有效性,这个有兴趣自己研究吧
zxcvsh
2018-11-05 12:47:14 +08:00
第三方工具解决很快,如果你很急的话
V2exUser
2018-11-05 12:50:38 +08:00
如果你自己没什么实现思路,也不是为了练手,只是使用的话,找现有的轮子吧
PulpFunction
2018-11-05 12:59:09 +08:00
字典里面套(字典或者数组)
zzj0311
2018-11-05 13:01:40 +08:00
不是很懂你要干嘛,明明有现成的序列化轮子,要啥取啥不就完了,还要描述干嘛。。
verrickt
2018-11-05 13:11:50 +08:00
最快的方法:用语言的 JSON 库,反序列化,处理,序列化。

最折腾的方法:自己写个 JSON to JSON 的编译器。前端接受源 JSON 文件,词法分析,语法分析和语义分析后生成语法树。后端遍历语法书生成目标 JSON 格式。

不知道 lz 打算怎么解析源 JSON。我提个醒,正则表达式不足以描述 JSON 格式

这是我当时造轮子看的教程。lz 可以只看 3,4 节。搞清楚正则语言和上下文无关语言的适用范围就可以动手撸了

https://www.cnblogs.com/Ninputer/archive/2011/06/07/2074632.html

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

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

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

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

© 2021 V2EX