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

为什么别人家返回的 json 字符串是自带格式化效果的, 而我的就是一坨长串?

  •  
  •   chineselittleboy · 2016-06-27 10:45:17 +08:00 · 7898 次点击
    这是一个创建于 3102 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是别人家的:
    别人家的

    这是我家的:
    我家的

    45 条回复    2016-06-28 09:43:02 +08:00
    slixurd
        1
    slixurd  
       2016-06-27 10:53:16 +08:00   ❤️ 1
    很多 JSON 库都自带 beautify 参数
    justfly
        2
    justfly  
       2016-06-27 10:56:49 +08:00   ❤️ 5
    说明你的比人家的优化的好
    Ouyangan
        3
    Ouyangan  
       2016-06-27 10:57:40 +08:00   ❤️ 1
    chrome 插件:JSON-handle
    chineselittleboy
        4
    chineselittleboy  
    OP
       2016-06-27 11:05:24 +08:00
    @justfly 人家的好看
    abelyao
        5
    abelyao  
       2016-06-27 11:08:47 +08:00
    我觉得 json 应该保持数据本身的纯粹性,如果是我,我会选择你家的那种,至于接收方要怎么美化查看,是另一回事
    zenxds
        6
    zenxds  
       2016-06-27 11:09:48 +08:00
    返回就直接格式化好了,比如 JSON.stringify(response, null, 4)
    chairuosen
        7
    chairuosen  
       2016-06-27 11:11:06 +08:00
    chrome 插件 json formatter
    allce231
        8
    allce231  
       2016-06-27 11:38:59 +08:00
    json 本身就是字符串
    SuperMild
        9
    SuperMild  
       2016-06-27 11:43:33 +08:00
    数据传输时还是一坨的好,要看内容时各自处理。
    ango
        10
    ango  
       2016-06-27 12:04:39 +08:00
    header json 声明即可
    Infernalzero
        11
    Infernalzero  
       2016-06-27 12:08:53 +08:00   ❤️ 1
    看你用什么方式转换成 JSON 返回了
    如果用别人造的轮子的话,一般都会提供"features"参数供选择格式,设置成自己喜欢的格式就 OK
    cloverstd
        12
    cloverstd  
       2016-06-27 12:19:11 +08:00
    一坨多好,可以节省资源,:D
    你看到的『序列化』,其实是用空格给填充出来的
    heaton_nobu
        13
    heaton_nobu  
       2016-06-27 12:19:58 +08:00
    你的请求头里有 application/json 吗?
    akira
        14
    akira  
       2016-06-27 12:24:28 +08:00
    生产服上面肯定是用一坨的啦
    7timesonenight
        15
    7timesonenight  
       2016-06-27 12:24:44 +08:00
    仅传输的话,空白字符多,影响性能,占用带宽流量,
    slixurd
        16
    slixurd  
       2016-06-27 12:32:57 +08:00
    现在的服务器哪一个不开 gzip ,就一堆空格能有什么影响。
    lslqtz
        17
    lslqtz  
       2016-06-27 12:46:06 +08:00
    复制空格,然后加进去输出
    gimp
        18
    gimp  
       2016-06-27 12:49:10 +08:00
    数据的传输还是一坨好,查看是另一个问题,可以丢到 http://json.cn/ 上去
    incompatible
        19
    incompatible  
       2016-06-27 13:18:28 +08:00 via iPhone
    @slixurd
    1. gzip 平白耗 cpu
    2. json 数据在进入 gzip 并发给客户端这个环节之前也许已经经过了数个内部 rpc 链路或者经过了数个 IO 传输环节,这些环节会受到影响
    3. pretty json 的过程本身也会耗费额外的 cpu 时间

    对性能有影响是肯定的
    slixurd
        20
    slixurd  
       2016-06-27 16:00:22 +08:00
    @incompatible 嗯,的确是消耗 CPU 的,然而数据体积减小,网络链路传输变快了。
    至于内部 RPC ,我想没有什么 RPC 框架是以文本形式传输的,都是压缩后的 binary 。
    miaosu
        21
    miaosu  
       2016-06-27 16:03:17 +08:00
    这个无所谓吧。。。我觉得你的更好一些~
    pi1ot
        22
    pi1ot  
       2016-06-27 16:06:42 +08:00
    你返回的 http head 里的 content-type 不是 json
    zencoding
        23
    zencoding  
       2016-06-27 16:10:28 +08:00
    header("Content-Type: application/json;")
    gyteng
        24
    gyteng  
       2016-06-27 16:18:23 +08:00   ❤️ 1
    显然是一坨好, pretty 的话涉及用 tab 还是 space ,会引起圣战的。
    BOYPT
        25
    BOYPT  
       2016-06-27 16:26:27 +08:00
    一般 jsonnify 函数都有 pretty 开关的,比如 php 的 json_encode($data, JSON_PRETTY_PRINT);
    比如 nodejs 的 JSON.stringify(data, null, 4);

    在程序看来是等效的(非压缩传输的话会带了比较多空格)
    ipconfiger
        26
    ipconfiger  
       2016-06-27 16:35:50 +08:00
    就一串, 省流量. format 的话到本地了用工具
    Vie
        27
    Vie  
       2016-06-27 16:42:38 +08:00
    <div class="box">
    <div class="inner" align="center">
    <a href="https://www.wilddog.com/?utm_source=v2ex&amp;utm_medium=banner&amp;utm_content=homepageright&amp;utm_campaign=suzhoucodingcamp" target="_blank"><img src="//cdn.wilddog.com/images/ads/v2ex/v2ex-500x500-1.jpg" border="0" width="250" height="250" alt="野狗科技"></a>
    </div>
    </div>
    Vie
        28
    Vie  
       2016-06-27 16:42:55 +08:00
    @Vie 竟然不行
    binux
        29
    binux  
       2016-06-27 16:47:10 +08:00
    @incompatible
    1. 难道不加 indent 就不开 gzip 了吗?
    2. 就算内部不 gzip ,多几个空格能大多少,有多少影响。真在意 protobuf 啊, msgpack 都好过 JSON 。
    3. 会增加,但是并不会增加多少。 pretty 不是额外操作,是序列化的内部过程,只是是否在输出 object 序列化前判断下是否加入 indent ,并不会增加多少消耗。

    这东西难道不是纯看喜好吗?
    jswh
        30
    jswh  
       2016-06-27 17:01:48 +08:00
    @binux @incompatible
    PHP7 的 json 函数解析其中有控制符的 json 的时候会出错,无法正确解析。官方回复是不会支持,因为 json 的标准里面就是没有控制符的。我没有读过标准,不知真假。
    这个坑了我很久。
    binux
        31
    binux  
       2016-06-27 17:14:15 +08:00
    @jswh 什么叫有控制符的 json ? JSON 标准规定:

    > All Unicode characters may be placed within the
    > quotation marks, except for the characters that must be escaped:
    > quotation mark, reverse solidus, and the control characters (U+0000
    > through U+001F).

    有控制符的 json 那还叫 json 吗?
    jswh
        32
    jswh  
       2016-06-27 17:17:21 +08:00
    @binux 就是那些为了格式化而放的换号, tab 之类的
    binux
        33
    binux  
       2016-06-27 17:20:21 +08:00
    @jswh 瞎说

    JSON-text = ws value ws

    Insignificant whitespace is allowed before or after any of the six
    structural characters.

    ws = *(
    %x20 / ; Space
    %x09 / ; Horizontal tab
    %x0A / ; Line feed or New line
    %x0D ) ; Carriage return
    zarvin
        34
    zarvin  
       2016-06-27 17:25:40 +08:00
    chrome 的话可以用 web 前端助手 这个插件
    Lullaby
        35
    Lullaby  
       2016-06-27 21:34:51 +08:00
    jsonview
    kslr
        36
    kslr  
       2016-06-27 22:42:41 +08:00
    @pi1ot 你是图钉吗
    fhefh
        37
    fhefh  
       2016-06-27 22:45:16 +08:00
    kevinroot
        38
    kevinroot  
       2016-06-27 23:05:34 +08:00
    “别人家的”多了一些空格换行,浪费空间。就是应该一坨,解析或者用工具查看就好了。 chrome 有 JSONView
    predator
        39
    predator  
       2016-06-27 23:13:16 +08:00
    我家开发测试环境带 PRETTY 格式,生产环境不带
    lslqtz
        40
    lslqtz  
       2016-06-27 23:34:39 +08:00 via iPhone
    @slixurd 那么小数据没必要开 gzip 。。
    个人表示,不喜欢加空格,这些是让程序来处理的。。
    Balthild
        41
    Balthild  
       2016-06-28 01:30:28 +08:00 via Android   ❤️ 1
    测试时用别人家的,生产时用你家的。
    pi1ot
        42
    pi1ot  
       2016-06-28 09:00:39 +08:00
    @kslr 图钉是什么东西
    vus520
        43
    vus520  
       2016-06-28 09:12:10 +08:00
    ```php
    ➜ ~ php -a
    Interactive shell

    php > $a = ["a"=>"b", "c"=>["d", "e", "f"]];
    php > echo json_encode($a, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    {
    "a": "b",
    "c": [
    "d",
    "e",
    "f"
    ]
    }
    php > $a = ["a"=>"b", "c"=>["中文也行啊", '引号"也行啊']];
    php > echo json_encode($a, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
    {
    "a": "b",
    "c": [
    "中文也行啊",
    "引号\"也行啊"
    ]
    }
    php >

    ```
    killerv
        44
    killerv  
       2016-06-28 09:16:39 +08:00
    如果仅仅为了好看,浏览器装个插件就行了,比这个好看好用。
    wbt
        45
    wbt  
       2016-06-28 09:43:02 +08:00
    用 chrome 插件啊骚年
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3108 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:03 · PVG 21:03 · LAX 05:03 · JFK 08:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.