首页 文章

如何使用JavaScript漂亮地打印JSON?

提问于
浏览
1806

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

24 回答

  • 5

    Use Newtonsoft.Json dll. 这在IE和Chrome中运行良好

    将此代码放在剃刀视图中

    if (Model.YourJsonSting!= null)
            {
                <pre>
                <code style="display:block;white-space:pre-wrap">
                          @JToken.Parse(Model.YourJsonSting).ToString(Formatting.Indented)
                    </code>
                </pre>
            }
    
  • 2

    这是用户123444555621非常适合终端的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);
    
  • 0

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

    功能(全部可选):

    • 设置线宽并以一种方式进行换行,使对象和数组在适合时保持在同一条线上,当它们不适合时,每行包装一个值 .

    • 如果您愿意,可以对对象键进行排序 .

    • 对齐对象键(排列冒号) .

    • 将浮点数格式化为特定的小数位数,而不会弄乱整数 .

    • 'Short'包装模式将开始和结束括号/大括号放在与值相同的行上,提供某些偏好的格式 .

    • 对数组和对象,括号之间,冒号和逗号之前/之后的间距进行粒度控制 .

    • 功能可供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);
    
  • 12

    这是一个用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

    希望有所帮助!

  • 15

    如果你正在寻找一个很好的库来在网页上美化json ......

    Prism.js非常好 .

    http://prismjs.com/

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

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

    例如:

    Prism.highlightAll()
    
  • 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

    Or a full snippet provided below:

    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; }
    
  • 1

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

    它使用 syntax-highlightingsmart indentationremoves quotes from keys ,只是让输出变得漂亮 .

    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 => console.dir(JSON.parse(chunk), {depth: null, colors: true})}))"

  • -3

    更好的方法 .

    Prettify JSON Array in Javascript

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

    我使用的是JSONView Chrome extension(它很漂亮:):

    编辑:添加 jsonreport.js

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

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

  • 3948
  • 190

    效果很好:

    console.table()
    

    在这里阅读更多:https://developer.mozilla.org/pt-BR/docs/Web/API/Console/table

  • 3

    如果您需要在textarea中工作,则接受的解决方案将无效 .

    <textarea id='textarea'></textarea>

    $("#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;
    }
    
  • 2
    var jsonObj = {"streetLabel": "Avenue Anatole France", "city": "Paris 07",  "postalCode": "75007", "countryCode": "FRA",  "countryLabel": "France" };
    
    document.getElementById("result-before").innerHTML = JSON.stringify(jsonObj);
    

    如果以HTML格式显示,您应该添加一个应答器 <pre></pre>

    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>
    
  • -6

    非常感谢@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;
     }
    
  • 4

    我今天遇到了一个问题@ Pumbaa80 's code. I' m试图将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

  • 3

    如果你使用net.sf.json,你可以如下打印(使用4空格缩进):

    JSONObject work = JSONObject.fromObject("{\"hi\":\"there\",\"more\":\"stuff\"}");
    log.info("WORK="+work.toString(4));
    
  • 20

    显示对象以进行调试的最简单方法:

    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
    
  • 1

    根据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不支持在控制台中进行%转义 . 奇怪......也许这将在未来发挥作用 .

    干杯!

  • 3

    我建议使用 HighlightJS . 它使用 same principle 作为接受的答案,但也适用于 many other languages ,并且具有 many pre-defined colour schemes . 如果使用RequireJS,则可以生成兼容模块

    python3 tools/build.py -tamd json xml <specify other language here>
    

    Generation依赖于Python3和Java . 添加 -n 到生成非缩小版本 .

  • 1

    您可以使用JSON.stringify(您的对象,null,2)第二个参数可以用作替换器函数,它将key和Val作为参数 . 这可以用于您想要修改JSON对象中的内容 .

  • 0

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

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

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

  • 0

    Douglas Crockford在JavaScript库中的JSON将通过stringify方法打印JSON .

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

  • 0

    这很好:

    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
    
  • 0

    以下是如何在不使用本机功能的情况下进行打印 .

    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
        }
      }
    */
    

相关问题