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

用汉字做 json 的 key,是不是因为中文编程的影响?

  •  
  •   henryhu · 2019-03-04 10:55:59 +08:00 · 7651 次点击
    这是一个创建于 2096 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用某云的 api,看到返回的 json 结构中,key 是汉语,难道开发者学过易语音之类的中文编程?
    第 1 条附言  ·  2019-03-04 13:09:56 +08:00
    看了评论,发觉这个场景使用中文 key 是对的,谢谢诸位大拿的解释。
    第 2 条附言  ·  2019-03-04 19:25:10 +08:00
    再次反转,现在我认为用中文做 key 不好,具体到这个营业执照识别,把外部识别来的文本作为 key,那这个接口是不稳定的。随着识别图片的不同,key 会变动,用户需要自己去处理这个变化。
    50 条回复    2019-07-06 04:06:57 +08:00
    boris1993
        1
    boris1993  
       2019-03-04 11:02:24 +08:00 via Android
    或者 ta 觉得切输入法很爽
    tabris17
        2
    tabris17  
       2019-03-04 11:03:32 +08:00
    人家是考虑到 api 使用者的能力水平,另一方面可以省去写文档了
    kernel
        3
    kernel  
       2019-03-04 11:05:42 +08:00 via Android
    不发个 api 文档地址吗
    si
        4
    si  
       2019-03-04 11:08:34 +08:00
    json 用中文做 key 有什么,json 的 key 本来就是字符串。还有人用数字和符号做 key。
    HypoChen
        5
    HypoChen  
       2019-03-04 11:10:10 +08:00   ❤️ 6
    这种呢?

    ```
    {
    "is_succeed":"✅"
    }
    ```
    henryhu
        6
    henryhu  
    OP
       2019-03-04 11:11:57 +08:00
    api 截图在这里
    0x11901
        7
    0x11901  
       2019-03-04 11:26:52 +08:00
    为什么不能用中文当 key ?我还用 emoji 做变量名称呢?思维逐渐江化。
    Flasky
        8
    Flasky  
       2019-03-04 11:37:09 +08:00 via Android
    中文英文在代码里都是字符串,编程难道就只能用英文吗?会不会有点装逼的感觉?
    aver4vex
        9
    aver4vex  
       2019-03-04 11:40:05 +08:00
    起变量名真特么头大。
    bestie
        10
    bestie  
       2019-03-04 11:45:44 +08:00
    这个变量名确实不太好起,可能在特定的场景使用中文 key 更加合适
    coderluan
        11
    coderluan  
       2019-03-04 11:45:48 +08:00   ❤️ 1
    明知同事英语水平不好,还拒绝使用中文注释,这种不叫专业,叫装逼。此事同理。
    Sapp
        12
    Sapp  
       2019-03-04 11:55:27 +08:00   ❤️ 3
    @coderluan 这种情况是管理人员和架构的锅,一开始没带好节奏,我这里所有 api 接口都要求注释,注释必须中文,精确到每个 key 的详细解释以及 value 的类型和值的范围,之后直接自动读注释生成文档,每个根目录下都有对应的开发流程图和详细项目文档,包括涉及到的技术和原型,虽然初期花点时间,但是后期除非有 bug 否则根本不需要对接,是个人就看明白了,没按要求的代码都提不上去。
    henryhu
        13
    henryhu  
    OP
       2019-03-04 11:56:59 +08:00
    有同学认为使用中文作为 key 没什么问题,这个问题可以讨论哈。具体到这个 api,有点怪异啊,code, msg, result 这些不使用中文也罢,问题是“法定代表人”下面又来一个 words 是啥意思?难道不应该是"法定代表人.文字"。words 其实是完全多余的。哪个同学设计的这个 api,请出来走两步,我保证......
    reus
        14
    reus  
       2019-03-04 12:10:16 +08:00   ❤️ 1
    这个场景,中文 key 没问题

    words 也没问题,给以后加字段留下空间。你还是太嫩。

    总之没有问题。
    LukeChien
        15
    LukeChien  
       2019-03-04 12:39:07 +08:00 via Android
    可能因为 json 不支持注释,为了提高可读性
    coderluan
        16
    coderluan  
       2019-03-04 12:39:13 +08:00
    @Sapp 你说的对,但是跑题了吧,这个贴只是说中文和英文应该看实际需求,你这个扯太远了。
    SuperMild
        17
    SuperMild  
       2019-03-04 13:02:37 +08:00   ❤️ 1
    某些情况下用中文其实很好, 特别清晰.

    上面有人说换输入法麻烦, 但是像这个例子的具体情况, 你用了英文做 key, 搞不好还要想办法通过注释或者文档用中文来说明, 到时还是要用中文, 岂不是更麻烦.
    belin520
        18
    belin520  
       2019-03-04 13:07:07 +08:00
    场景:"识别成功"

    key 是识别的 key (法定代表人:xxx )
    这个场景我觉得对呀,不然还得 OCR 之后翻译成英文吗?
    lynskylate
        19
    lynskylate  
       2019-03-04 13:15:04 +08:00 via Android
    看场景。中文可以省去注释和想变量名,尤其在同事水平不高的情况下(▰˘◡˘▰)。但是大多情况下,message,status 这种大家都能理解,你用中文不是自找不痛快?我不用中文的原因最主要是不喜欢切输入法
    gps949
        20
    gps949  
       2019-03-04 13:53:35 +08:00
    首先,我认同为了同事、合作者等方便,可以用中文,或者应当注释用中文写。

    但另一方面,我想说,已经 9102 年了,编程语言千万条,你学了 c 学了 c#学了 java 学了 js 学了 php 学了 python 学了 golang 学了……不考虑简单学一下英语吗?毕竟在输入法切换、国际通用化、字符集环境等问题上省心很多啊
    irobbin
        21
    irobbin  
       2019-03-04 14:15:58 +08:00
    竟然有人说没问题。。万一有人不认识中文咋搞?
    henryhu
        22
    henryhu  
    OP
       2019-03-04 14:21:27 +08:00
    是的,目前是中国人做开发,ok,以后要是让一个不懂中文的老外接手代码,估计要懵逼。
    exceloo
        23
    exceloo  
       2019-03-04 14:21:41 +08:00
    @henryhu 你说多个 word 没意思,其实对方应该是想到了以后的扩展。以后想要多加个字段也很容易,而且也可以兼容老页面。
    wengjin456123
        24
    wengjin456123  
       2019-03-04 14:37:26 +08:00 via Android
    这有啥的,key 用中文我觉得没问题,看场景
    qq292382270
        25
    qq292382270  
       2019-03-04 15:26:01 +08:00
    跟我对接的一个后端,返回的数据喜欢用英文单词来定义 key 或者变量名之类,但是又很不标准..
    reus
        26
    reus  
       2019-03-04 15:34:00 +08:00   ❤️ 1
    明显是营业执照的文字识别接口,如果一个外国人连汉字都不懂,他做啥文字识别?这里用中文是正确的。这些汉字本来就是营业执照上面的文字,识别出来的也是中文字,你非要用英文是什么意思?
    henryhu
        27
    henryhu  
    OP
       2019-03-04 15:38:52 +08:00
    就这个场景来说,仍然有商榷的地方。key 直接使用识别出来的文本,其实没有考虑到文本变动的情况。

    比如,以后如果新的证件修改了,把“住所”改成“营业地址”,那就得新加一个“营业地址”字段,并且,api 用户要自己判断,“住所”和“营业地址”是同一个信息。api 如果有预见,无论新旧证件,都用 address 表示营业地址,无需修改 api,方便用户使用。

    当然,也可以不修改 api,仍然使用中文 key,新的“营业地址”信息放到“住所”里,这个变化对于新用户来说有点蒙圈。
    MineDog
        28
    MineDog  
       2019-03-04 16:00:53 +08:00 via Android
    会有编码方式不一致导致的乱码的风险
    maichael
        29
    maichael  
       2019-03-04 16:02:52 +08:00
    因为这里的 key 本来就是中文的,这个“中文”也是识别出来的呀。
    henryhu
        30
    henryhu  
    OP
       2019-03-04 16:10:43 +08:00
    如何写成这样,是不是感觉自然一点,也不需要冗余的 words:

    ```
    result: {
    address: {
    label: '住所',
    content: '***********'
    },
    ...
    ```
    0987363
        31
    0987363  
       2019-03-04 16:20:07 +08:00 via Android
    扯淡吧,服务器返回的 gbk 编码,你客户端是 utf8,怎么破,还有繁体的
    reus
        32
    reus  
       2019-03-04 17:08:56 +08:00
    @henryhu 营业执照登记的事项是《公司法》规定的,不是随便改的,想改是要修法的,不会有谁无聊到改一个同义词。
    Tokin
        33
    Tokin  
       2019-03-04 17:26:16 +08:00
    Tokin
        34
    Tokin  
       2019-03-04 17:27:26 +08:00
    henryhu
        35
    henryhu  
    OP
       2019-03-04 18:01:40 +08:00
    @Tokin 被墙了。如果这样写,用户使用一个值,不得不去遍历 result,不太好吧
    icylogic
        36
    icylogic  
       2019-03-04 18:08:11 +08:00 via iPhone
    @0987363 为什么要去考虑写服务器会返回 gbk 编码的人……
    reus
        37
    reus  
       2019-03-04 18:12:42 +08:00
    @Tokin 因为 label 是唯一的,所以把 label 作为键,就变成了最开始的样子。
    johnnyNg
        38
    johnnyNg  
       2019-03-04 19:44:53 +08:00
    写成这样比较好吧,
    [
    {
    "label": "法定代表人",

    "value": "王某"
    },

    {
    "label": "成立日期",

    "value": "2019-02-11"
    }
    ]
    AlphaTr
        39
    AlphaTr  
       2019-03-04 19:45:11 +08:00
    说 JSON 用 GBK 的。。。你们用的真是 JSON 么
    ffeii
        40
    ffeii  
       2019-03-04 19:47:58 +08:00
    反正都要遍历的,jsonArray 和 jsonObject 不都一样吗,用 jsonObject 还能省字节
    Tokin
        41
    Tokin  
       2019-03-04 20:17:49 +08:00
    @henryhu 的确,如果只是单纯的全部显示还好,如果只用某一个值的话,好像用中文做 key 我也能接受,但是感觉“不规范”甚至感觉很奇怪。
    @reus emmm,你的账号好像出了点问题,你的回复我收不到提醒。
    henryhu
        42
    henryhu  
    OP
       2019-03-05 00:11:05 +08:00
    @reus 我还真去查了一下公司法,它的规定如下:

    "公司营业执照应当载明公司的名称、住所、注册资本、经营范围、法定代表人姓名等事项。"

    这里没有规定营业执照上只能是这几个事项,比如还有一个重要的“统一社会信用代码“没在公司法上规定,而且,三证合一也改过营业执照上的登记事项。
    reus
        43
    reus  
       2019-03-05 00:29:54 +08:00
    @henryhu 那就更应该保持原样,不要自作聪明。不要假定 "address" 就一定对应 "住所"。现在有种虚拟注册地址,用来注册的,实际经营地址又是另一个。如果以后法定需要将实际经营地址也写上去,那 "address" 就有两个了,你又要如何表示?数据原本是怎样就怎样,你是处理不了的,不要帮用户做多余的事情。营业执照本身就是一系列键值对,键是怎样就怎样,你只是一个识别接口,你不要假定调用接口的人要怎样使用这些数据,这不是一个文字识别接口应该做的事情。
    jokerlee
        44
    jokerlee  
       2019-03-05 00:37:20 +08:00 via Android
    这个 api 设计不太好,还是用 array 好一些,每个字段之少有一个 key 描述,而且没法在兼容现有格式的前提下加新的顶级字段
    henryhu
        45
    henryhu  
    OP
       2019-03-05 01:00:59 +08:00
    意见仍然分歧,我还是认为接口是服务。营业执照写的是一些企业信息,在计算机中表示为键值对,并不能就认定营业执照本身是按键值对的规则来设计的。如果用户只需要识别图片中的键值对,不要做其他动作,那 words 的预留就没有必要了。意见保留哈。
    swulling
        46
    swulling  
       2019-03-05 08:40:07 +08:00 via iPhone
    38 正解
    gzf6
        47
    gzf6  
       2019-03-05 08:46:49 +08:00 via iPhone
    淘宝的某些数据也是如此
    leefly
        48
    leefly  
       2019-03-05 08:59:42 +08:00
    @HypoChen (这种的拖出去打三十分钟 🤣
    hoyixi
        49
    hoyixi  
       2019-03-05 10:10:56 +08:00
    别忘了,API 是给你用的,到时候真有问题,他们改 API 分分钟,麻烦的又不是他们自己。

    很多平台的意识里,开发者就不算客户吗?不思量下客户体验吗?
    xuanwu
        50
    xuanwu  
       2019-07-06 04:06:57 +08:00
    请问是哪个 API ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5292 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:53 · PVG 11:53 · LAX 19:53 · JFK 22:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.