V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
einsdisp
V2EX  ›  Go 编程语言

Golang 的生态实在太差了!难道就不存在一个 API,可以直接往 JSON 中添追加新的 key/value?

  •  
  •   einsdisp · 2020-07-30 09:23:52 +08:00 · 13307 次点击
    这是一个创建于 1606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    研究了下内置的 encoding/json,以及流行的第三方 JSON 库 jsonitor,还在 github 上搜了搜,基本没找到有这个功能。

    别告诉我可以先 Unmarshall 到 map[string]interface{}中再 Marshall,或者直接操作裸[]byte,这根本不是“真正”的解决办法。

    79 条回复    2020-12-04 16:25:55 +08:00
    B1ankCat
        1
    B1ankCat  
       2020-07-30 09:27:41 +08:00   ❤️ 1
    你应该想到这是个机会,你把这个功能封装好提个 pr 给官方库
    rrfeng
        2
    rrfeng  
       2020-07-30 09:29:35 +08:00 via Android
    你告诉我哪种语言可以不 unmarshal 就能加 key 的?
    StarUDream
        3
    StarUDream  
       2020-07-30 09:31:01 +08:00
    来了来了,他来了
    GTim
        4
    GTim  
       2020-07-30 09:31:15 +08:00
    真的是老鼠精的洞府
    nigelvon
        5
    nigelvon  
       2020-07-30 09:37:53 +08:00   ❤️ 4
    序列化后的数据一般都是反序列化之后再修改吧,哪有能直接修改序列化数据的。
    1069401249
        6
    1069401249  
       2020-07-30 09:42:12 +08:00   ❤️ 8
    世界上最好的语言 PHP 都没有这个 api
    pengjay
        7
    pengjay  
       2020-07-30 09:43:25 +08:00
    封装成一个函数不就有 API 了
    tcfenix
        8
    tcfenix  
       2020-07-30 09:43:52 +08:00   ❤️ 6
    你想不 Unmarshall 解决问题?

    办法有啊!
    你手里拿着 byte array,然后通过你多年编程的经验,猜出来具体需要添加的位置是哪个地方,然后把你的 kv 插进这个位置,

    你看这样不就好了?
    guonaihong
        9
    guonaihong  
       2020-07-30 09:44:29 +08:00   ❤️ 3
    darksword21
        10
    darksword21  
       2020-07-30 09:45:18 +08:00
    直接机器码编程
    tcfenix
        11
    tcfenix  
       2020-07-30 09:45:41 +08:00
    想了想还真的可行啊,如果就添加在最外层的话,直接 从<}">的位置前面插就好了

    哈哈哈哈哈哈,给 官方库提个 mr 吧
    zzzmj
        12
    zzzmj  
       2020-07-30 09:47:35 +08:00
    黑人问号脸
    Vegetable
        13
    Vegetable  
       2020-07-30 09:48:05 +08:00
    真滴秀,JSON 在编程语言里不都是二等公民吗,都不是原生数据对象,当然要现转换才能修改啊
    gowk
        14
    gowk  
       2020-07-30 09:48:46 +08:00
    水贴、已 B 、不送
    deplives
        15
    deplives  
       2020-07-30 09:48:49 +08:00
    最近钓鱼贴越来越多了哈
    scnace
        16
    scnace  
       2020-07-30 09:51:05 +08:00 via Android
    sjson 可以干这事,自己不会搜索不要怪社区(还有标准库为啥要提供这种 JSON path ?不符合大道至简啊🙈
    5yyy
        17
    5yyy  
       2020-07-30 09:56:11 +08:00
    @zzzmj 地铁,手机,老头
    janxin
        18
    janxin  
       2020-07-30 09:59:36 +08:00
    楼主🎣技术太差,下一个问题
    woodongwong
        19
    woodongwong  
       2020-07-30 10:10:15 +08:00
    @guonaihong /大拇指
    lxml
        20
    lxml  
       2020-07-30 10:23:12 +08:00 via Android   ❤️ 4
    谁说 go 没有,你直接拿到[]byte 的指针,用 unsafe 按着头往里面写不就完事了
    qW7bo2FbzbC0
        21
    qW7bo2FbzbC0  
       2020-07-30 10:24:38 +08:00   ❤️ 1
    大概是指想要 python 字典那种便捷操作吧。

    但即使在 python 中严格来说 json 串指的是 json.dumps(dict)后的结果,而不是 dict 。

    强类型语言似乎没有办法快捷的给 class 或者 struct 加属性或者字段。

    不知道利用反射可不可以,但是利用反射加字段让代码看起来像是起了一个脓包
    tidyoux
        22
    tidyoux  
       2020-07-30 10:28:15 +08:00
    reus
        23
    reus  
       2020-07-30 10:34:15 +08:00   ❤️ 3
    moka20477
        24
    moka20477  
       2020-07-30 10:37:38 +08:00
    你有发帖这时间都已经封装完函数了
    damngood
        25
    damngood  
       2020-07-30 10:38:07 +08:00
    啊,你们说的生态就是这种呀...
    难道不管什么功能都要有个外部依赖库来做的吗...
    这种东西自己弄一下也不用费什么力气的吧.
    hronro
        26
    hronro  
       2020-07-30 11:05:05 +08:00
    @rrfeng #2 JavaScript
    rrfeng
        27
    rrfeng  
       2020-07-30 11:26:46 +08:00
    @hronro 仔细想想?
    yuzo555
        28
    yuzo555  
       2020-07-30 11:30:40 +08:00
    简单啊,如果 JSON 是标准非空无空白的,直接在倒数第二个字符串位置(“}”之前)插入:
    ,"key":"value"
    就行了。

    但真没必要,不差这个解析和转换的内存和时间
    InkStone
        29
    InkStone  
       2020-07-30 11:44:26 +08:00
    楼上那么多回复让我怀疑 Java 是一门小众语言

    楼主说的不就是 Java JsonObject 那样的专用 JSON API 么
    wysnylc
        30
    wysnylc  
       2020-07-30 12:07:52 +08:00
    @InkStone #29 无论是什么语言,curd Json 都得反序列化.这贴主的要求是不能反序列化直接写字符串
    sadfQED2
        31
    sadfQED2  
       2020-07-30 12:18:29 +08:00 via Android
    @InkStone java 也得先把字符串反序列化成 jsonObject 呀
    huiyifyj
        32
    huiyifyj  
       2020-07-30 12:57:14 +08:00
    建议你去用动态脚本语言写,比如 JavaScript
    这喷得好奇怪。
    Jooooooooo
        33
    Jooooooooo  
       2020-07-30 13:00:07 +08:00
    建生态的机会来了
    szkoda
        34
    szkoda  
       2020-07-30 13:17:49 +08:00
    @reus #23 + 1
    wangritian
        35
    wangritian  
       2020-07-30 13:18:39 +08:00
    你不分析怎么知道一坨字符串里面包含什么东西?你怎么就确定它是 map[string]interface{}?
    sonxzjw
        36
    sonxzjw  
       2020-07-30 13:21:09 +08:00
    已 block 不送
    ClarkAbe
        37
    ClarkAbe  
       2020-07-30 13:22:03 +08:00 via iPhone
    ??? json 的老爸 js 想操作他都得转实体,要么自己封装要么爱用用不缺你一个
    CharlotteLi
        38
    CharlotteLi  
       2020-07-30 13:39:56 +08:00
    我咋感觉楼主是来钓解决方案的,和 300 元以内的耳机都是辣鸡一样。
    allenhu
        39
    allenhu  
       2020-07-30 13:48:32 +08:00 via Android
    话说 map[string]interface{}相当倒胃口
    pythonee
        40
    pythonee  
       2020-07-30 14:11:22 +08:00
    撸起袖子干
    onikage
        41
    onikage  
       2020-07-30 14:17:56 +08:00
    楼上的能人不少啊, 楼主只是吐槽不方便, 这么多人都知道这问题也不见人提交, 有人提出这问题就在这说风凉话, 还 tm 钓鱼, 自己钓鱼习惯了吧? 还是难得找到个机会要显摆自己一下?
    johnnyNg
        42
    johnnyNg  
       2020-07-30 14:19:38 +08:00
    json 在 js 中算一等公民了,也得先 parse 再操作
    j0hnj
        43
    j0hnj  
       2020-07-30 14:25:59 +08:00   ❤️ 3
    @onikage #41 是楼主提问方式的问题,明明可以说 "请问一下大家,Golang 中是否存在直接往 JSON 中追加新的 key/value 的 API ?",非得上来喷一句,这样不被喷才怪了
    onikage
        44
    onikage  
       2020-07-30 14:52:37 +08:00
    @j0hnj go 的生态现在不太成熟是事实, 喷 go 的生态我认为也不是不讲道理.
    duanquanyong
        45
    duanquanyong  
       2020-07-30 15:01:14 +08:00
    https://github.com/tidwall/sjson 这不是吗?
    你上来不问有没有,自己找不到就得出结论说生态差?
    wleven
        46
    wleven  
       2020-07-30 15:05:19 +08:00
    用 map 呗 处理完再序列化
    Chenamy2017
        47
    Chenamy2017  
       2020-07-30 15:09:17 +08:00
    请教问题就请教问题,别到处扣帽子。没有一个生态是完美的。
    TypeError
        48
    TypeError  
       2020-07-30 15:46:33 +08:00 via Android
    先学会提问
    haosamax
        49
    haosamax  
       2020-07-30 15:49:03 +08:00
    这个问题,他是个问题吗?
    reus
        50
    reus  
       2020-07-30 17:43:44 +08:00   ❤️ 1
    @onikage 事实个屁,自己搜不出来,怪生态?你看这里回复的都给了多少包的地址了!
    RubyJack
        51
    RubyJack  
       2020-07-30 17:51:57 +08:00   ❤️ 4
    水平太差 建议转行写 js
    airplayxcom
        52
    airplayxcom  
       2020-07-30 18:06:12 +08:00 via iPhone
    引战帖 告辞
    ihciah
        53
    ihciah  
       2020-07-30 18:20:54 +08:00   ❤️ 3
    正确的提问姿势
    est
        54
    est  
       2020-07-30 18:29:22 +08:00   ❤️ 3
    气的这么多人都直接贴了库的网址。。。果然是正确的提问姿势
    kinghui
        55
    kinghui  
       2020-07-30 18:30:41 +08:00   ❤️ 2
    大概还不太知道啥是 JSON,下面都是合法的 JSON 字符串

    - "1"
    - "\"s\""
    - "true"
    - "1.1"
    - "[1.1]"
    - "{\"key\": \"value\"}"
    yujiff
        56
    yujiff  
       2020-07-30 18:31:25 +08:00
    路过。。。
    haleyao
        57
    haleyao  
       2020-07-30 18:35:39 +08:00   ❤️ 3
    楼主平安 回复者平安 V2EX 平安
    winglight2016
        58
    winglight2016  
       2020-07-30 19:52:35 +08:00
    几年前刚开始接触 go,我也被这问题难住了,marshal 来 unmarshal 去,现在我用 python/js,已经看不懂 lz 的问题是啥了。。。
    yangbonis
        59
    yangbonis  
       2020-07-30 19:58:05 +08:00 via iPhone
    临时用用的话,jq 不舒服吗
    fancy2020
        60
    fancy2020  
       2020-07-30 21:53:39 +08:00
    v 站上越水的帖子越能火...
    vc1
        61
    vc1  
       2020-07-30 21:58:44 +08:00 via Android   ❤️ 2
    学到了,原来这才是提问的正确姿势,回复里的解决办法真不错
    merin96
        62
    merin96  
       2020-07-30 23:19:53 +08:00
    tikazyq
        63
    tikazyq  
       2020-07-30 23:20:49 +08:00
    为啥不直接用 struct ?静态语言用动态的方法写,感觉有些反模式
    billlee
        64
    billlee  
       2020-07-30 23:29:11 +08:00
    SAX 风格的库就可以不做反序列化,C++ 和 Java 的主流库都是支持的吧
    WilliamYang
        65
    WilliamYang  
       2020-07-31 00:07:29 +08:00
    这才是正确的提问方式,下次想问问题的朋友可以参考一下
    lslqtz
        66
    lslqtz  
       2020-07-31 03:51:18 +08:00   ❤️ 1
    这样的提问方式确实好,就是容易被 b
    abowloflrf
        67
    abowloflrf  
       2020-07-31 09:09:37 +08:00 via iPhone
    甚至觉得楼主是来黑 golang 的
    vipppppp
        68
    vipppppp  
       2020-07-31 09:34:34 +08:00
    @winglight2016
    楼主 python 版本就是:

    为什么我 a = json.dumps(data)后,不能直接往 a 添加一个新的 key-value,python 真是垃圾[狗头]
    JokeFunny
        69
    JokeFunny  
       2020-07-31 09:44:55 +08:00
    这是来搞笑的吧
    jimages
        70
    jimages  
       2020-07-31 09:48:07 +08:00
    学习了正确的提问方法
    janxin
        71
    janxin  
       2020-07-31 09:55:16 +08:00
    @billlee SAX 风格不能处理某些合法的 JSON 格式吧,比如#55 提出来的那几种
    Carlgao
        72
    Carlgao  
       2020-07-31 10:50:46 +08:00
    楼主一边挨着骂一边偷笑,自己搜个锤子,这不就有解决方案了吗
    bruce0
        73
    bruce0  
       2020-07-31 11:11:16 +08:00
    @pengjay 很有道理, 哈哈哈哈哈
    prenwang
        74
    prenwang  
       2020-07-31 11:19:59 +08:00
    楼主你好牛
    wdlth
        75
    wdlth  
       2020-07-31 23:50:14 +08:00
    建议先去把 RFC 4627 了解清楚,JSON 不一定是有 Key 的对象,可能是数组,甚至只是一个 null 或者 false,到时候你怎么插呢?
    Balthild
        76
    Balthild  
       2020-08-02 23:13:31 +08:00 via iPhone
    提问时老老实实遵守《提问的智慧》:问题看起来很好看然而无人问津

    直接抛出一个错误答案:跑出一大堆人用正确回答“教育”自己
    qingsonghe
        77
    qingsonghe  
       2020-08-03 20:54:38 +08:00
    使用 map[interface{}]interface{}解决问题
    cbasil
        78
    cbasil  
       2020-08-13 09:24:36 +08:00
    php 都需要 json_decode 将 json 转换成数组或者对象后才能修改数据,改完后再 json_encode 回去
    liuyexing
        79
    liuyexing  
       2020-12-04 16:25:55 +08:00
    https://github.com/tidwall/gjson
    https://github.com/tidwall/sjson
    这两个库难道还不能满足您的需求吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2801 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 14:34 · PVG 22:34 · LAX 06:34 · JFK 09:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.