V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
chineselittleboy
V2EX  ›  问与答

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

  •  
  •   chineselittleboy · Jun 27, 2016 · 8444 views
    This topic created in 3594 days ago, the information mentioned may be changed or developed.

    这是别人家的:
    别人家的

    这是我家的:
    我家的

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

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

    在程序看来是等效的(非压缩传输的话会带了比较多空格)
    ipconfiger
        26
    ipconfiger  
       Jun 27, 2016
    就一串, 省流量. format 的话到本地了用工具
    Vie
        27
    Vie  
       Jun 27, 2016
    <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  
       Jun 27, 2016
    @Vie 竟然不行
    binux
        29
    binux  
       Jun 27, 2016
    @incompatible
    1. 难道不加 indent 就不开 gzip 了吗?
    2. 就算内部不 gzip ,多几个空格能大多少,有多少影响。真在意 protobuf 啊, msgpack 都好过 JSON 。
    3. 会增加,但是并不会增加多少。 pretty 不是额外操作,是序列化的内部过程,只是是否在输出 object 序列化前判断下是否加入 indent ,并不会增加多少消耗。

    这东西难道不是纯看喜好吗?
    jswh
        30
    jswh  
       Jun 27, 2016
    @binux @incompatible
    PHP7 的 json 函数解析其中有控制符的 json 的时候会出错,无法正确解析。官方回复是不会支持,因为 json 的标准里面就是没有控制符的。我没有读过标准,不知真假。
    这个坑了我很久。
    binux
        31
    binux  
       Jun 27, 2016
    @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  
       Jun 27, 2016
    @binux 就是那些为了格式化而放的换号, tab 之类的
    binux
        33
    binux  
       Jun 27, 2016
    @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  
       Jun 27, 2016
    chrome 的话可以用 web 前端助手 这个插件
    Lullaby
        35
    Lullaby  
       Jun 27, 2016
    jsonview
    kslr
        36
    kslr  
       Jun 27, 2016
    @pi1ot 你是图钉吗
    fhefh
        37
    fhefh  
       Jun 27, 2016
    kevinroot
        38
    kevinroot  
       Jun 27, 2016
    “别人家的”多了一些空格换行,浪费空间。就是应该一坨,解析或者用工具查看就好了。 chrome 有 JSONView
    predator
        39
    predator  
       Jun 27, 2016
    我家开发测试环境带 PRETTY 格式,生产环境不带
    lslqtz
        40
    lslqtz  
       Jun 27, 2016 via iPhone
    @slixurd 那么小数据没必要开 gzip 。。
    个人表示,不喜欢加空格,这些是让程序来处理的。。
    Balthild
        41
    Balthild  
       Jun 28, 2016 via Android   ❤️ 1
    测试时用别人家的,生产时用你家的。
    pi1ot
        42
    pi1ot  
       Jun 28, 2016
    @kslr 图钉是什么东西
    vus520
        43
    vus520  
       Jun 28, 2016
    ```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  
       Jun 28, 2016
    如果仅仅为了好看,浏览器装个插件就行了,比这个好看好用。
    wbt
        45
    wbt  
       Jun 28, 2016
    用 chrome 插件啊骚年
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   887 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 110ms · UTC 19:28 · PVG 03:28 · LAX 12:28 · JFK 15:28
    ♥ Do have faith in what you're doing.