V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
glacer
V2EX  ›  问与答

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

  •  
  •   glacer · 2018-11-05 11:38:44 +08:00 · 1748 次点击
    这是一个创建于 2211 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    初步想法:

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

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

    14 条回复    2018-11-05 13:11:50 +08:00
    GeruzoniAnsasu
        1
    GeruzoniAnsasu  
       2018-11-05 11:45:04 +08:00
    你在说啥。。。几乎所有的编程语言都有将 json 转成本语言便于描述的结构的轮子

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


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

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

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

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

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

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

    https://www.cnblogs.com/Ninputer/archive/2011/06/07/2074632.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2595 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:46 · PVG 12:46 · LAX 20:46 · JFK 23:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.