glacer
0.02D
V2EX  ›  问与答

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

  •  
  •   glacer · Nov 5, 2018 · 2296 views
    This topic created in 2785 days ago, the information mentioned may be changed or developed.

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

    初步想法:

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

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

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

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


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

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

    需要考虑的最复杂的东西是怎么处理指针的生命周期,怎么保证指针指向结构的有效性,这个有兴趣自己研究吧
    zxcvsh
        10
    zxcvsh  
       Nov 5, 2018 via iPhone
    第三方工具解决很快,如果你很急的话
    V2exUser
        11
    V2exUser  
       Nov 5, 2018 via Android
    如果你自己没什么实现思路,也不是为了练手,只是使用的话,找现有的轮子吧
    PulpFunction
        12
    PulpFunction  
       Nov 5, 2018 via Android
    字典里面套(字典或者数组)
    zzj0311
        13
    zzj0311  
       Nov 5, 2018 via Android
    不是很懂你要干嘛,明明有现成的序列化轮子,要啥取啥不就完了,还要描述干嘛。。
    verrickt
        14
    verrickt  
       Nov 5, 2018 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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2128 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 54ms · UTC 00:01 · PVG 08:01 · LAX 17:01 · JFK 20:01
    ♥ Do have faith in what you're doing.