【问题标题】:pretty-print JSON using JavaScript使用 JavaScript 漂亮地打印 JSON
【发布时间】:2015-07-03 09:42:29
【问题描述】:

如何以易于阅读(供人类读者阅读)的格式显示 JSON?我主要寻找缩进和空白,甚至可能是颜色/字体样式/等。

【问题讨论】:

  • 如果你只是输出到html,你可以把它包装在一个<pre>标签中。
  • 所有答案都可以,但您必须使用 javascript :: var str = JSON.stringify(obj, null, 2);在 html //

标签: javascript json pretty-print


【解决方案1】:

它适用于 Laravel,Codeigniter html: <pre class="jsonPre"> </pre>

控制器:从控制器返回 JSON 值,就像

return json_encode($data, JSON_PRETTY_PRINT);

在脚本中: <script> $('.jsonPre').html(result); </script>

结果是

【讨论】:

    【解决方案2】:

    基于@user123444555621,稍微现代一点。

    const clsMap = [
        [/^".*:$/, "key"],
        [/^"/, "string"],
        [/true|false/, "boolean"],
        [/null/, "key"],
        [/.*/, "number"],
    ]
    
    const syntaxHighlight = obj => JSON.stringify(obj, null, 4)
        .replace(/&/g, '&')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, match => `<span class="${clsMap.find(([regex]) => regex.test(match))[1]}">${match}</span>`);
    

    你也可以在js里面指定颜色(不需要CSS)

    const clsMap = [
        [/^".*:$/, "red"],
        [/^"/, "green"],
        [/true|false/, "blue"],
        [/null/, "magenta"],
        [/.*/, "darkorange"],
    ]
    
    const syntaxHighlight = obj => JSON.stringify(obj, null, 4)
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, match => `<span style="color:${clsMap.find(([regex]) => regex.test(match))[1]}">${match}</span>`);
    

    还有一个更少正则表达式的版本

    const clsMap = [
        [match => match.startsWith('"') && match.endsWith(':'), "red"],
        [match => match.startsWith('"'), "green"],
        [match => match === "true" || match === "false" , "blue"],
        [match => match === "null", "magenta"],
        [() => true, "darkorange"],
    ];
        
    const syntaxHighlight = obj => JSON.stringify(obj, null, 4)
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, match => `<span style="color:${clsMap.find(([fn]) => fn(match))[1]}">${match}</span>`);
    

    【讨论】:

      【解决方案3】:

      我想在这里展示我的 jsonAnalyze 方法,它只打印 JSON 结构的漂亮,但在某些情况下可能比打印整个 JSON 更有用。 p>

      假设你有一个像这样的复杂 JSON:

      let theJson = {
      'username': 'elen',
      'email': 'elen@test.com',
      'state': 'married',
      'profiles': [
          {'name': 'elenLove', 'job': 'actor' },
          {'name': 'elenDoe', 'job': 'spy'}
      ],
      'hobbies': ['run', 'movies'],
      'status': {
          'home': { 
              'ownsHome': true,
              'addresses': [
                  {'town': 'Mexico', 'address': '123 mexicoStr'},
                  {'town': 'Atlanta', 'address': '4B atlanta 45-48'},
              ]
          },
          'car': {
              'ownsCar': true,
              'cars': [
                  {'brand': 'Nissan', 'plate': 'TOKY-114', 'prevOwnersIDs': ['4532354531', '3454655344', '5566753422']},
                  {'brand': 'Benz', 'plate': 'ELEN-1225', 'prevOwnersIDs': ['4531124531', '97864655344', '887666753422']}
              ]
          }
      },
      'active': true,
      'employed': false,
      };
      

      然后该方法将返回如下结构:

      username
      email
      state
      profiles[]
          profiles[].name
          profiles[].job
      hobbies[]
      status{}
          status{}.home{}
              status{}.home{}.ownsHome
              status{}.home{}.addresses[]
                  status{}.home{}.addresses[].town
                  status{}.home{}.addresses[].address
          status{}.car{}
              status{}.car{}.ownsCar
              status{}.car{}.cars[]
                  status{}.car{}.cars[].brand
                  status{}.car{}.cars[].plate
                  status{}.car{}.cars[].prevOwnersIDs[]
      active
      employed
      

      所以这是jsonAnalyze() 代码:

      function jsonAnalyze(obj) {
              let arr = [];
              analyzeJson(obj, null, arr);
              return logBeautifiedDotNotation(arr);
      
          function analyzeJson(obj, parentStr, outArr) {
              let opt;
              if (!outArr) {
                  return "no output array given"
              }
              for (let prop in obj) {
                  opt = parentStr ? parentStr + '.' + prop : prop;
                  if (Array.isArray(obj[prop]) && obj[prop] !== null) {
                          let arr = obj[prop];
                      if ((Array.isArray(arr[0]) || typeof arr[0] == "object") && arr[0] != null) {                        
                          outArr.push(opt + '[]');
                          analyzeJson(arr[0], opt + '[]', outArr);
                      } else {
                          outArr.push(opt + '[]');
                      }
                  } else if (typeof obj[prop] == "object" && obj[prop] !== null) {
                          outArr.push(opt + '{}');
                          analyzeJson(obj[prop], opt + '{}', outArr);
                  } else {
                      if (obj.hasOwnProperty(prop) && typeof obj[prop] != 'function') {
                          outArr.push(opt);
                      }
                  }
              }
          }
      
          function logBeautifiedDotNotation(arr) {
              retStr = '';
              arr.map(function (item) {
                  let dotsAmount = item.split(".").length - 1;
                  let dotsString = Array(dotsAmount + 1).join('    ');
                  retStr += dotsString + item + '\n';
                  console.log(dotsString + item)
              });
              return retStr;
          }
      }
      
      jsonAnalyze(theJson);
      

      【讨论】:

        【解决方案4】:

        使用BootstrapHTML中突出和美化它:

        function prettifyJson(json, prettify) {
            if (typeof json !== 'string') {
                if (prettify) {
                    json = JSON.stringify(json, undefined, 4);
                } else {
                    json = JSON.stringify(json);
                }
            }
            return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,
                function(match) {
                    let cls = "<span>";
                    if (/^"/.test(match)) {
                        if (/:$/.test(match)) {
                            cls = "<span class='text-danger'>";
                        } else {
                            cls = "<span>";
                        }
                    } else if (/true|false/.test(match)) {
                        cls = "<span class='text-primary'>";
                    } else if (/null/.test(match)) {
                        cls = "<span class='text-info'>";
                    }
                    return cls + match + "</span>";
                }
            );
        }
        

        【讨论】:

          【解决方案5】:
          <!-- here is a complete example pretty print with more space between lines-->
          <!-- be sure to pass a json string not a json object -->
          <!-- use line-height to increase or decrease spacing between json lines -->
          
          <style  type="text/css">
          .preJsonTxt{
            font-size: 18px;
            text-overflow: ellipsis;
            overflow: hidden;
            line-height: 200%;
          }
          .boxedIn{
            border: 1px solid black;
            margin: 20px;
            padding: 20px;
          }
          </style>
          
          <div class="boxedIn">
              <h3>Configuration Parameters</h3>
              <pre id="jsonCfgParams" class="preJsonTxt">{{ cfgParams }}</pre>
          </div>
          
          <script language="JavaScript">
          $( document ).ready(function()
          {
               $(formatJson);
          
               <!-- this will do a pretty print on the json cfg params      -->
               function formatJson() {
                   var element = $("#jsonCfgParams");
                   var obj = JSON.parse(element.text());
                  element.html(JSON.stringify(obj, undefined, 2));
               }
          });
          </script>
          

          【讨论】:

            【解决方案6】:

            找不到任何对控制台具有良好语法突出显示的解决方案,所以这是我的 2p

            安装和添加 cli-highlight 依赖项

            npm install cli-highlight --save
            

            全局定义 logjson

            const highlight = require('cli-highlight').highlight
            console.logjson = (obj) => console.log(
                                           highlight( JSON.stringify(obj, null, 4), 
                                                      { language: 'json', ignoreIllegals: true } ));
            

            使用

            console.logjson({foo: "bar", someArray: ["string1", "string2"]});
            

            【讨论】:

              【解决方案7】:

              您可以使用JSON.stringify(your object, null, 2) 第二个参数可以用作替换函数,它以 key 和 Val 作为参数。如果你想修改 JSON 对象中的某些内容,可以使用它。

              更多参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

              【讨论】:

              • 此答案与获得超过 5400 票的最佳答案重复。
              【解决方案8】:

              这是 user123444555621 的适用于终端的出色 HTML。方便调试节点脚本:

              function prettyJ(json) {
                if (typeof json !== 'string') {
                  json = JSON.stringify(json, undefined, 2);
                }
                return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, 
                  function (match) {
                    let cls = "\x1b[36m";
                    if (/^"/.test(match)) {
                      if (/:$/.test(match)) {
                        cls = "\x1b[34m";
                      } else {
                        cls = "\x1b[32m";
                      }
                    } else if (/true|false/.test(match)) {
                      cls = "\x1b[35m"; 
                    } else if (/null/.test(match)) {
                      cls = "\x1b[31m";
                    }
                    return cls + match + "\x1b[0m";
                  }
                );
              }
              

              用法:

              // thing = any json OR string of json
              prettyJ(thing);
              

              【讨论】:

                【解决方案9】:
                var jsonObj = {"streetLabel": "Avenue Anatole France", "city": "Paris 07",  "postalCode": "75007", "countryCode": "FRA",  "countryLabel": "France" };
                
                document.getElementById("result-before").innerHTML = JSON.stringify(jsonObj);
                

                如果以 HTML 显示,你应该添加一个应答器&lt;pre&gt;&lt;/pre&gt;

                document.getElementById("result-after").innerHTML = "<pre>"+JSON.stringify(jsonObj,undefined, 2) +"</pre>"
                

                例子:

                var jsonObj = {"streetLabel": "Avenue Anatole France", "city": "Paris 07",  "postalCode": "75007", "countryCode": "FRA",  "countryLabel": "France" };
                
                document.getElementById("result-before").innerHTML = JSON.stringify(jsonObj);
                
                document.getElementById("result-after").innerHTML = "<pre>"+JSON.stringify(jsonObj,undefined, 2) +"</pre>"
                div { float:left; clear:both; margin: 1em 0; }
                <div id="result-before"></div>
                <div id="result-after"></div>

                【讨论】:

                  【解决方案10】:

                  为调试目的显示对象的最简单方法:

                  console.log("data",data) // lets you unfold the object manually
                  

                  如果您想在 DOM 中显示该对象,您应该考虑它可能包含将被解释为 HTML 的字符串。因此,您需要do some escaping...

                  var s = JSON.stringify(data,null,2) // format
                  var e = new Option(s).innerHTML // escape
                  document.body.insertAdjacentHTML('beforeend','<pre>'+e+'</pre>') // display
                  

                  【讨论】:

                    【解决方案11】:

                    这是一个用 React 编写的简单 JSON 格式/颜色组件:

                    const HighlightedJSON = ({ json }: Object) => {
                      const highlightedJSON = jsonObj =>
                        Object.keys(jsonObj).map(key => {
                          const value = jsonObj[key];
                          let valueType = typeof value;
                          const isSimpleValue =
                            ["string", "number", "boolean"].includes(valueType) || !value;
                          if (isSimpleValue && valueType === "object") {
                            valueType = "null";
                          }
                          return (
                            <div key={key} className="line">
                              <span className="key">{key}:</span>
                              {isSimpleValue ? (
                                <span className={valueType}>{`${value}`}</span>
                              ) : (
                                highlightedJSON(value)
                              )}
                            </div>
                          );
                        });
                      return <div className="json">{highlightedJSON(json)}</div>;
                    };
                    

                    查看它在此 CodePen 中的工作情况: https://codepen.io/benshope/pen/BxVpjo

                    希望有帮助!

                    【讨论】:

                      【解决方案12】:

                      这是不使用本机功能的打印方式。

                      function pretty(ob, lvl = 0) {
                      
                        let temp = [];
                      
                        if(typeof ob === "object"){
                          for(let x in ob) {
                            if(ob.hasOwnProperty(x)) {
                              temp.push( getTabs(lvl+1) + x + ":" + pretty(ob[x], lvl+1) );
                            }
                          }
                          return "{\n"+ temp.join(",\n") +"\n" + getTabs(lvl) + "}";
                        }
                        else {
                          return ob;
                        }
                      
                      }
                      
                      function getTabs(n) {
                        let c = 0, res = "";
                        while(c++ < n)
                          res+="\t";
                        return res;
                      }
                      
                      let obj = {a: {b: 2}, x: {y: 3}};
                      console.log(pretty(obj));
                      
                      /*
                        {
                          a: {
                            b: 2
                          },
                          x: {
                            y: 3
                          }
                        }
                      */
                      

                      【讨论】:

                        【解决方案13】:

                        如果您正在寻找一个漂亮的库来美化网页上的 json...

                        Prism.js 相当不错。

                        http://prismjs.com/

                        我发现使用 JSON.stringify(obj, undefined, 2) 来获取缩进,然后使用 prism 添加主题是一个不错的方法。

                        如果您通过 ajax 调用加载 JSON,那么您可以运行 Prism 的实用方法之一来美化

                        例如:

                        Prism.highlightAll()
                        

                        【讨论】:

                          【解决方案14】:

                          更好的方法。

                          Prettify JSON Array in Javascript

                          JSON.stringify(jsonobj,null,'\t')
                          

                          【讨论】:

                            【解决方案15】:

                            我今天遇到了@Pumbaa80 的代码问题。我正在尝试将 JSON 语法突出显示应用于我在 Mithril 视图中呈现的数据,因此我需要为 JSON.stringify 输出中的所有内容创建 DOM 节点。

                            我也将非常长的正则表达式拆分为其组成部分。

                            render_json = (data) ->
                              # wraps JSON data in span elements so that syntax highlighting may be
                              # applied. Should be placed in a `whitespace: pre` context
                              if typeof(data) isnt 'string'
                                data = JSON.stringify(data, undefined, 2)
                              unicode =     /"(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?/
                              keyword =     /\b(true|false|null)\b/
                              whitespace =  /\s+/
                              punctuation = /[,.}{\[\]]/
                              number =      /-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/
                            
                              syntax = '(' + [unicode, keyword, whitespace,
                                        punctuation, number].map((r) -> r.source).join('|') + ')'
                              parser = new RegExp(syntax, 'g')
                            
                              nodes = data.match(parser) ? []
                              select_class = (node) ->
                                if punctuation.test(node)
                                  return 'punctuation'
                                if /^\s+$/.test(node)
                                  return 'whitespace'
                                if /^\"/.test(node)
                                  if /:$/.test(node)
                                    return 'key'
                                  return 'string'
                            
                                if /true|false/.test(node)
                                  return 'boolean'
                            
                                 if /null/.test(node)
                                   return 'null'
                                 return 'number'
                              return nodes.map (node) ->
                                cls = select_class(node)
                                return Mithril('span', {class: cls}, node)
                            

                            Github 上的上下文代码here

                            【讨论】:

                              【解决方案16】:

                              Pretty-printing is implemented natively in JSON.stringify()。第三个参数启用漂亮的打印并设置要使用的间距:

                              var str = JSON.stringify(obj, null, 2); // spacing level = 2
                              

                              如果你需要语法高亮,你可以像这样使用一些正则表达式魔法:

                              function syntaxHighlight(json) {
                                  if (typeof json != 'string') {
                                       json = JSON.stringify(json, undefined, 2);
                                  }
                                  json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                                  return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
                                      var cls = 'number';
                                      if (/^"/.test(match)) {
                                          if (/:$/.test(match)) {
                                              cls = 'key';
                                          } else {
                                              cls = 'string';
                                          }
                                      } else if (/true|false/.test(match)) {
                                          cls = 'boolean';
                                      } else if (/null/.test(match)) {
                                          cls = 'null';
                                      }
                                      return '<span class="' + cls + '">' + match + '</span>';
                                  });
                              }
                              

                              在这里查看实际操作:jsfiddle

                              或下面提供的完整 sn-p:

                              function output(inp) {
                                  document.body.appendChild(document.createElement('pre')).innerHTML = inp;
                              }
                              
                              function syntaxHighlight(json) {
                                  json = json.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
                                  return json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
                                      var cls = 'number';
                                      if (/^"/.test(match)) {
                                          if (/:$/.test(match)) {
                                              cls = 'key';
                                          } else {
                                              cls = 'string';
                                          }
                                      } else if (/true|false/.test(match)) {
                                          cls = 'boolean';
                                      } else if (/null/.test(match)) {
                                          cls = 'null';
                                      }
                                      return '<span class="' + cls + '">' + match + '</span>';
                                  });
                              }
                              
                              var obj = {a:1, 'b':'foo', c:[false,'false',null, 'null', {d:{e:1.3e5,f:'1.3e5'}}]};
                              var str = JSON.stringify(obj, undefined, 4);
                              
                              output(str);
                              output(syntaxHighlight(str));
                              pre {outline: 1px solid #ccc; padding: 5px; margin: 5px; }
                              .string { color: green; }
                              .number { color: darkorange; }
                              .boolean { color: blue; }
                              .null { color: magenta; }
                              .key { color: red; }

                              【讨论】:

                              • 超级棒。我添加了一个函数来在新窗口中弹出它以进行调试: var json = syntaxHighlight(JSON.stringify(obj,undefined,4);); var w = window.open(); var html = ""; html+= "
                                "+json+"
                                "; w.document.writeln(html);
                              • 不错。不过别忘了它需要 css 和 &lt;pre&gt;
                              • 请注意,stringify(...) 适用于 JSON 对象,而不适用于 JSON 字符串。如果有字符串,需要先JSON.parse(...)
                              • 我在 sardapv.github.io/json-prettier 上构建了一个工具 :)
                              • @user123444555621 感谢您所做的一切。正是我在看的东西
                              【解决方案17】:

                              如果您需要它在 textarea 中工作,则接受的解决方案将不起作用。

                              &lt;textarea id='textarea'&gt;&lt;/textarea&gt;

                              $("#textarea").append(formatJSON(JSON.stringify(jsonobject),true));

                              function formatJSON(json,textarea) {
                                  var nl;
                                  if(textarea) {
                                      nl = "&#13;&#10;";
                                  } else {
                                      nl = "<br>";
                                  }
                                  var tab = "&#160;&#160;&#160;&#160;";
                                  var ret = "";
                                  var numquotes = 0;
                                  var betweenquotes = false;
                                  var firstquote = false;
                                  for (var i = 0; i < json.length; i++) {
                                      var c = json[i];
                                      if(c == '"') {
                                          numquotes ++;
                                          if((numquotes + 2) % 2 == 1) {
                                              betweenquotes = true;
                                          } else {
                                              betweenquotes = false;
                                          }
                                          if((numquotes + 3) % 4 == 0) {
                                              firstquote = true;
                                          } else {
                                              firstquote = false;
                                          }
                                      }
                              
                                      if(c == '[' && !betweenquotes) {
                                          ret += c;
                                          ret += nl;
                                          continue;
                                      }
                                      if(c == '{' && !betweenquotes) {
                                          ret += tab;
                                          ret += c;
                                          ret += nl;
                                          continue;
                                      }
                                      if(c == '"' && firstquote) {
                                          ret += tab + tab;
                                          ret += c;
                                          continue;
                                      } else if (c == '"' && !firstquote) {
                                          ret += c;
                                          continue;
                                      }
                                      if(c == ',' && !betweenquotes) {
                                          ret += c;
                                          ret += nl;
                                          continue;
                                      }
                                      if(c == '}' && !betweenquotes) {
                                          ret += nl;
                                          ret += tab;
                                          ret += c;
                                          continue;
                                      }
                                      if(c == ']' && !betweenquotes) {
                                          ret += nl;
                                          ret += c;
                                          continue;
                                      }
                                      ret += c;
                                  } // i loop
                                  return ret;
                              }
                              

                              【讨论】:

                                【解决方案18】:

                                效果很好:

                                console.table()
                                

                                在此处阅读更多信息:https://developer.mozilla.org/pt-BR/docs/Web/API/Console/table

                                【讨论】:

                                  【解决方案19】:

                                  这很好:

                                  https://github.com/mafintosh/json-markup 来自mafintosh

                                  const jsonMarkup = require('json-markup')
                                  const html = jsonMarkup({hello:'world'})
                                  document.querySelector('#myElem').innerHTML = html
                                  

                                  HTML

                                  <link ref="stylesheet" href="style.css">
                                  <div id="myElem></div>
                                  

                                  可在此处找到示例样式表

                                  https://raw.githubusercontent.com/mafintosh/json-markup/master/style.css
                                  

                                  【讨论】:

                                    【解决方案20】:

                                    根据 Pumbaa80 的回答,我修改了代码以使用 console.log 颜色(肯定在 Chrome 上工作)而不是 HTML。可以在控制台内看到输出。您可以在函数内编辑 _variables 添加更多样式。

                                    function JSONstringify(json) {
                                        if (typeof json != 'string') {
                                            json = JSON.stringify(json, undefined, '\t');
                                        }
                                    
                                        var 
                                            arr = [],
                                            _string = 'color:green',
                                            _number = 'color:darkorange',
                                            _boolean = 'color:blue',
                                            _null = 'color:magenta',
                                            _key = 'color:red';
                                    
                                        json = json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
                                            var style = _number;
                                            if (/^"/.test(match)) {
                                                if (/:$/.test(match)) {
                                                    style = _key;
                                                } else {
                                                    style = _string;
                                                }
                                            } else if (/true|false/.test(match)) {
                                                style = _boolean;
                                            } else if (/null/.test(match)) {
                                                style = _null;
                                            }
                                            arr.push(style);
                                            arr.push('');
                                            return '%c' + match + '%c';
                                        });
                                    
                                        arr.unshift(json);
                                    
                                        console.log.apply(console, arr);
                                    }
                                    

                                    这是一个您可以使用的书签:

                                    javascript:function JSONstringify(json) {if (typeof json != 'string') {json = JSON.stringify(json, undefined, '\t');}var arr = [],_string = 'color:green',_number = 'color:darkorange',_boolean = 'color:blue',_null = 'color:magenta',_key = 'color:red';json = json.replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {var style = _number;if (/^"/.test(match)) {if (/:$/.test(match)) {style = _key;} else {style = _string;}} else if (/true|false/.test(match)) {style = _boolean;} else if (/null/.test(match)) {style = _null;}arr.push(style);arr.push('');return '%c' + match + '%c';});arr.unshift(json);console.log.apply(console, arr);};void(0);
                                    

                                    用法:

                                    var obj = {a:1, 'b':'foo', c:[false,null, {d:{e:1.3e5}}]};
                                    JSONstringify(obj);
                                    

                                    编辑:我只是试图在变量声明之后用这一行转义 % 符号:

                                    json = json.replace(/%/g, '%%');
                                    

                                    但我发现 Chrome 不支持控制台中的 % 转义。奇怪......也许这在未来会起作用。

                                    干杯!

                                    【讨论】:

                                      【解决方案21】:

                                      非常感谢@all! 根据前面的答案,这里是另一种提供自定义替换规则作为参数的变体方法:

                                       renderJSON : function(json, rr, code, pre){
                                         if (typeof json !== 'string') {
                                            json = JSON.stringify(json, undefined, '\t');
                                         }
                                        var rules = {
                                         def : 'color:black;',    
                                         defKey : function(match){
                                                   return '<strong>' + match + '</strong>';
                                                },
                                         types : [
                                             {
                                                name : 'True',
                                                regex : /true/,
                                                type : 'boolean',
                                                style : 'color:lightgreen;'
                                             },
                                      
                                             {
                                                name : 'False',
                                                regex : /false/,
                                                type : 'boolean',
                                                style : 'color:lightred;'
                                             },
                                      
                                             {
                                                name : 'Unicode',
                                                regex : /"(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?/,
                                                type : 'string',
                                                style : 'color:green;'
                                             },
                                      
                                             {
                                                name : 'Null',
                                                regex : /null/,
                                                type : 'nil',
                                                style : 'color:magenta;'
                                             },
                                      
                                             {
                                                name : 'Number',
                                                regex : /-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/,
                                                type : 'number',
                                                style : 'color:darkorange;'
                                             },
                                      
                                             {
                                                name : 'Whitespace',
                                                regex : /\s+/,
                                                type : 'whitespace',
                                                style : function(match){
                                                   return '&nbsp';
                                                }
                                             } 
                                      
                                          ],
                                      
                                          keys : [
                                             {
                                                 name : 'Testkey',
                                                 regex : /("testkey")/,
                                                 type : 'key',
                                                 style : function(match){
                                                   return '<h1>' + match + '</h1>';
                                                }
                                             }
                                          ],
                                      
                                          punctuation : {
                                                name : 'Punctuation',
                                                regex : /([\,\.\}\{\[\]])/,
                                                type : 'punctuation',
                                                style : function(match){
                                                   return '<p>________</p>';
                                                }
                                             }
                                      
                                        };
                                      
                                        if('undefined' !== typeof jQuery){
                                           rules = $.extend(rules, ('object' === typeof rr) ? rr : {});  
                                        }else{
                                           for(var k in rr ){
                                              rules[k] = rr[k];
                                           }
                                        }
                                          var str = json.replace(/([\,\.\}\{\[\]]|"(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g, function (match) {
                                          var i = 0, p;
                                          if (rules.punctuation.regex.test(match)) {
                                                     if('string' === typeof rules.punctuation.style){
                                                         return '<span style="'+ rules.punctuation.style + '">' + match + '</span>';
                                                     }else if('function' === typeof rules.punctuation.style){
                                                         return rules.punctuation.style(match);
                                                     } else{
                                                        return match;
                                                     }            
                                          }
                                      
                                          if (/^"/.test(match)) {
                                              if (/:$/.test(match)) {
                                                  for(i=0;i<rules.keys.length;i++){
                                                  p = rules.keys[i];
                                                  if (p.regex.test(match)) {
                                                     if('string' === typeof p.style){
                                                         return '<span style="'+ p.style + '">' + match + '</span>';
                                                     }else if('function' === typeof p.style){
                                                         return p.style(match);
                                                     } else{
                                                        return match;
                                                     }                
                                                   }              
                                                 }   
                                                  return ('function'===typeof rules.defKey) ? rules.defKey(match) : '<span style="'+ rules.defKey + '">' + match + '</span>';            
                                              } else {
                                                  return ('function'===typeof rules.def) ? rules.def(match) : '<span style="'+ rules.def + '">' + match + '</span>';
                                              }
                                          } else {
                                              for(i=0;i<rules.types.length;i++){
                                               p = rules.types[i];
                                               if (p.regex.test(match)) {
                                                     if('string' === typeof p.style){
                                                         return '<span style="'+ p.style + '">' + match + '</span>';
                                                     }else if('function' === typeof p.style){
                                                         return p.style(match);
                                                     } else{
                                                        return match;
                                                     }                
                                                }             
                                              }
                                      
                                           }
                                      
                                          });
                                      
                                        if(true === pre)str = '<pre>' + str + '</pre>';
                                        if(true === code)str = '<code>' + str + '</code>';
                                        return str;
                                       }
                                      

                                      【讨论】:

                                      【解决方案22】:

                                      您可以使用console.dir(),这是console.log(util.inspect()) 的快捷方式。 (唯一的区别是它绕过了在对象上定义的任何自定义 inspect() 函数。)

                                      它使用 syntax-highlighting智能缩进从键中删除引号,只是让输出尽可能漂亮。 p>

                                      const object = JSON.parse(jsonString)
                                      
                                      console.dir(object, {depth: null, colors: true})
                                      

                                      对于命令行:

                                      cat package.json | node -e "process.stdin.pipe(new stream.Writable({write: chunk =&gt; console.dir(JSON.parse(chunk), {depth: null, colors: true})}))"

                                      【讨论】:

                                        【解决方案23】:

                                        如果您有一个想要漂亮打印的 对象,用户 Pumbaa80 的回答非常棒。如果您从想要打印的有效 JSON string 开始,则需要先将其转换为对象:

                                        var jsonString = '{"some":"json"}';
                                        var jsonPretty = JSON.stringify(JSON.parse(jsonString),null,2);  
                                        

                                        这会从字符串构建一个 JSON 对象,然后使用 JSON stringify 的漂亮打印将其转换回字符串。

                                        【讨论】:

                                        • 请注意,显示字符串时需要将其包装在&lt;pre&gt;&lt;/pre&gt;标签中。
                                        • 似乎只有在使用textarea时才有效,否则换行不进来
                                        【解决方案24】:

                                        对其他漂亮的 Ruby 打印机不满意,我编写了自己的 (NeatJSON) 和 ported it to JavaScript,包括 a free online formatter。该代码在 MIT 许可下是免费的(相当宽松)。

                                        功能(全部可选):

                                        • 设置线宽并换行,使对象和数组在合适时保持在同一行,在不合适时每行换行一个值。
                                        • 根据需要对对象键进行排序。
                                        • 对齐对象键(将冒号对齐)。
                                        • 将浮点数格式化为特定的小数位数,而不会弄乱整数。
                                        • “短”换行模式将左括号/大括号与值放在同一行,提供一些人喜欢的格式。
                                        • 对数组和对象的间距、括号之间、冒号和逗号之前/之后的间距进行精细控制。
                                        • Web 浏览器和 Node.js 都可以使用该功能。

                                        我将在此处复制源代码,以便这不仅仅是指向库的链接,但我鼓励您访问 GitHub project page,因为它将保持最新,下面的代码将不是。

                                        (function(exports){
                                        exports.neatJSON = neatJSON;
                                        
                                        function neatJSON(value,opts){
                                          opts = opts || {}
                                          if (!('wrap'          in opts)) opts.wrap = 80;
                                          if (opts.wrap==true) opts.wrap = -1;
                                          if (!('indent'        in opts)) opts.indent = '  ';
                                          if (!('arrayPadding'  in opts)) opts.arrayPadding  = ('padding' in opts) ? opts.padding : 0;
                                          if (!('objectPadding' in opts)) opts.objectPadding = ('padding' in opts) ? opts.padding : 0;
                                          if (!('afterComma'    in opts)) opts.afterComma    = ('aroundComma' in opts) ? opts.aroundComma : 0;
                                          if (!('beforeComma'   in opts)) opts.beforeComma   = ('aroundComma' in opts) ? opts.aroundComma : 0;
                                          if (!('afterColon'    in opts)) opts.afterColon    = ('aroundColon' in opts) ? opts.aroundColon : 0;
                                          if (!('beforeColon'   in opts)) opts.beforeColon   = ('aroundColon' in opts) ? opts.aroundColon : 0;
                                        
                                          var apad  = repeat(' ',opts.arrayPadding),
                                              opad  = repeat(' ',opts.objectPadding),
                                              comma = repeat(' ',opts.beforeComma)+','+repeat(' ',opts.afterComma),
                                              colon = repeat(' ',opts.beforeColon)+':'+repeat(' ',opts.afterColon);
                                        
                                          return build(value,'');
                                        
                                          function build(o,indent){
                                            if (o===null || o===undefined) return indent+'null';
                                            else{
                                              switch(o.constructor){
                                                case Number:
                                                  var isFloat = (o === +o && o !== (o|0));
                                                  return indent + ((isFloat && ('decimals' in opts)) ? o.toFixed(opts.decimals) : (o+''));
                                        
                                                case Array:
                                                  var pieces  = o.map(function(v){ return build(v,'') });
                                                  var oneLine = indent+'['+apad+pieces.join(comma)+apad+']';
                                                  if (opts.wrap===false || oneLine.length<=opts.wrap) return oneLine;
                                                  if (opts.short){
                                                    var indent2 = indent+' '+apad;
                                                    pieces = o.map(function(v){ return build(v,indent2) });
                                                    pieces[0] = pieces[0].replace(indent2,indent+'['+apad);
                                                    pieces[pieces.length-1] = pieces[pieces.length-1]+apad+']';
                                                    return pieces.join(',\n');
                                                  }else{
                                                    var indent2 = indent+opts.indent;
                                                    return indent+'[\n'+o.map(function(v){ return build(v,indent2) }).join(',\n')+'\n'+indent+']';
                                                  }
                                        
                                                case Object:
                                                  var keyvals=[],i=0;
                                                  for (var k in o) keyvals[i++] = [JSON.stringify(k), build(o[k],'')];
                                                  if (opts.sorted) keyvals = keyvals.sort(function(kv1,kv2){ kv1=kv1[0]; kv2=kv2[0]; return kv1<kv2?-1:kv1>kv2?1:0 });
                                                  keyvals = keyvals.map(function(kv){ return kv.join(colon) }).join(comma);
                                                  var oneLine = indent+"{"+opad+keyvals+opad+"}";
                                                  if (opts.wrap===false || oneLine.length<opts.wrap) return oneLine;
                                                  if (opts.short){
                                                    var keyvals=[],i=0;
                                                    for (var k in o) keyvals[i++] = [indent+' '+opad+JSON.stringify(k),o[k]];
                                                    if (opts.sorted) keyvals = keyvals.sort(function(kv1,kv2){ kv1=kv1[0]; kv2=kv2[0]; return kv1<kv2?-1:kv1>kv2?1:0 });
                                                    keyvals[0][0] = keyvals[0][0].replace(indent+' ',indent+'{');
                                                    if (opts.aligned){
                                                      var longest = 0;
                                                      for (var i=keyvals.length;i--;) if (keyvals[i][0].length>longest) longest = keyvals[i][0].length;
                                                      var padding = repeat(' ',longest);
                                                      for (var i=keyvals.length;i--;) keyvals[i][0] = padRight(padding,keyvals[i][0]);
                                                    }
                                                    for (var i=keyvals.length;i--;){
                                                      var k=keyvals[i][0], v=keyvals[i][1];
                                                      var indent2 = repeat(' ',(k+colon).length);
                                                      var oneLine = k+colon+build(v,'');
                                                      keyvals[i] = (opts.wrap===false || oneLine.length<=opts.wrap || !v || typeof v!="object") ? oneLine : (k+colon+build(v,indent2).replace(/^\s+/,''));
                                                    }
                                                    return keyvals.join(',\n') + opad + '}';
                                                  }else{
                                                    var keyvals=[],i=0;
                                                    for (var k in o) keyvals[i++] = [indent+opts.indent+JSON.stringify(k),o[k]];
                                                    if (opts.sorted) keyvals = keyvals.sort(function(kv1,kv2){ kv1=kv1[0]; kv2=kv2[0]; return kv1<kv2?-1:kv1>kv2?1:0 });
                                                    if (opts.aligned){
                                                      var longest = 0;
                                                      for (var i=keyvals.length;i--;) if (keyvals[i][0].length>longest) longest = keyvals[i][0].length;
                                                      var padding = repeat(' ',longest);
                                                      for (var i=keyvals.length;i--;) keyvals[i][0] = padRight(padding,keyvals[i][0]);
                                                    }
                                                    var indent2 = indent+opts.indent;
                                                    for (var i=keyvals.length;i--;){
                                                      var k=keyvals[i][0], v=keyvals[i][1];
                                                      var oneLine = k+colon+build(v,'');
                                                      keyvals[i] = (opts.wrap===false || oneLine.length<=opts.wrap || !v || typeof v!="object") ? oneLine : (k+colon+build(v,indent2).replace(/^\s+/,''));
                                                    }
                                                    return indent+'{\n'+keyvals.join(',\n')+'\n'+indent+'}'
                                                  }
                                        
                                                default:
                                                  return indent+JSON.stringify(o);
                                              }
                                            }
                                          }
                                        
                                          function repeat(str,times){ // http://stackoverflow.com/a/17800645/405017
                                            var result = '';
                                            while(true){
                                              if (times & 1) result += str;
                                              times >>= 1;
                                              if (times) str += str;
                                              else break;
                                            }
                                            return result;
                                          }
                                          function padRight(pad, str){
                                            return (str + pad).substring(0, pad.length);
                                          }
                                        }
                                        neatJSON.version = "0.5";
                                        
                                        })(typeof exports === 'undefined' ? this : exports);
                                        

                                        【讨论】:

                                          【解决方案25】:

                                          我使用JSONView Chrome extension(它非常漂亮:):

                                          编辑:添加jsonreport.js

                                          我还发布了一个在线独立的 JSON 漂亮打印查看器 jsonreport.js,它提供了一个人类可读的 HTML5 报告,您可以使用它来查看任何 JSON 数据。

                                          您可以在 New JavaScript HTML5 Report Format 中阅读有关格式的更多信息。

                                          【讨论】:

                                            【解决方案26】:

                                            【讨论】:

                                              【解决方案27】:

                                              Douglas Crockford 在 JavaScript 库中的 JSON 将通过 stringify 方法漂亮地打印 JSON。

                                              您可能还会发现这个旧问题的答案很有用:How can I pretty-print JSON in (unix) shell script?

                                              【讨论】:

                                                猜你喜欢
                                                • 2015-08-26
                                                • 2023-04-04
                                                • 2013-10-03
                                                • 2011-08-05
                                                相关资源
                                                最近更新 更多