用汉字做 json 的 key,是不是因为中文编程的影响? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
henryhu
V2EX    问与答

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

  •  
  •   henryhu 2019-03-04 10:55:59 +08:00 8138 次点击
    这是一个创建于 2414 天前的主题,其中的信息可能已经有所发展或是发生改变。
    使用某云的 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, 搞不好还要想办法通过注释或者文档用中文来说明, 到时还是要用中文, 岂不是更麻烦.
    icanfork
        18
    icanfork  
       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     Solana     2712 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 09:00 PVG 17:00 LAX 02:00 JFK 05:00
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86