พิมพ์สวย JSON โดยใช้ JavaScript


2425

ฉันจะแสดง JSON ในรูปแบบที่อ่านง่าย (สำหรับผู้อ่านที่เป็นมนุษย์) ได้อย่างไร? ฉันกำลังมองหาการเยื้องและช่องว่างเป็นหลักด้วยบางทีสี / แบบอักษร / อื่น ๆ




4
หากคุณเพิ่งจะส่งออกไปยัง html คุณสามารถรวมมันไว้ใน<pre>แท็ก
Ryan Walker

คำตอบ:


5058

JSON.stringify()พริตตี้พิมพ์จะดำเนินการโดยกำเนิดใน อาร์กิวเมนต์ที่สามช่วยให้สามารถพิมพ์ได้สวยและตั้งค่าระยะห่างที่จะใช้:

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

หากคุณต้องการเน้นไวยากรณ์คุณอาจใช้เวทมนตร์ของ regex ดังนี้:

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

หรือตัวอย่างโค้ดแบบเต็มด้านล่าง:


23
สุดยอดมาก ฉันได้เพิ่มฟังก์ชั่นเพื่อเปิดป๊อปอัพนี้ในหน้าต่างใหม่สำหรับการดีบั๊ก: var json = syntaxHighlight (JSON.stringify (obj, undefined, 4);); var w = window.open (); var html = "<head> <style> pre {outline: 1px solid #ccc; padding: 5px; margin: 5px;}. string {color: green;}"; html + = ".number {color: darkorange;} .boolean {color: blue;} .null {color: magenta;} .key {color: red;} </style> </head> <body>"; html + = "<pre>" + json + "</pre>"; w.document.writeln (HTML);
JayCrossler

16
ดี อย่าลืมที่จะต้อง CSS และ<pre>แม้ว่า
NoBugs

4
ด้วยเหตุผลบางอย่างเมื่อฉันแจ้งเตือนมันแสดงให้เห็นว่าการจัดรูปแบบแน่นอน แต่ยังคงแสดงสตริงแบนเมื่อฉันพ่นมันออกเป็น div ผ่าน jQuery: $ ("# transactionResponse"). show (). html (prettifyObject (data), null, '\ t'); โดยที่ prettifyObject เป็นวิธีที่ฉันสร้างขึ้นซึ่งมีสองบรรทัดแรกของคุณด้านบน
PositiveGuy

5
@CoffeeAddict ตรวจสอบให้แน่ใจว่า#transactionResponseองค์ประกอบของคุณมีwhite-space: pre;สไตล์เป็น CSS
user123444555621

72
โปรดทราบว่าstringify(...)ทำงานบนวัตถุ JSON ไม่ได้อยู่ในสตริง JSON หากคุณมีสตริงคุณต้องJSON.parse(...)ก่อน
Vihung

271

คำตอบของผู้ใช้ Pumbaa80 นั้นยอดเยี่ยมถ้าคุณมีวัตถุที่คุณต้องการพิมพ์สวย หากคุณเริ่มต้นจากสตริง JSON ที่ถูกต้องที่คุณต้องการพิมพ์สวยคุณต้องแปลงเป็นวัตถุก่อน:

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

สิ่งนี้สร้างวัตถุ JSON จากสตริงและจากนั้นแปลงกลับเป็นสตริงโดยใช้การพิมพ์ที่สวยของ JSON stringify


11
นี้ทำงานสำหรับฉัน แต่โยนผิดพลาดการใช้ดังนั้นผมจึงมีการปรับเปลี่ยนให้มันเป็นJSON.parse JSON.stringify(jsonString, null, 2)ขึ้นอยู่กับ JSON / Object ของคุณ
Jazzy

15
โปรดทราบว่าเมื่อแสดงสตริงคุณจะต้องล้อมด้วย<pre></pre>แท็ก
Undistraction

6
@ Jazzy JSON.parseจะตายก็ต่อเมื่อคุณมี JSON str ไม่ถูกต้องหรือมันถูกแปลงเป็นวัตถุแล้ว ... ต้องแน่ใจว่าคุณรู้ว่าดาต้าประเภทใดที่คุณกำลังติดต่อด้วยก่อนที่จะลองJSON.parse
Kolob Canyon

7
@ Jazzy หากคุณต้องทำเช่นนั้นคุณไม่มีสตริง JSON แสดงว่าคุณมีวัตถุปกติ JSON เป็นเสมอสตริง มันเป็นเพียงการแสดงสตริงของวัตถุ Javascript
Clonkex

37

ทางที่ดีกว่า

Prettify JSON Array ใน Javascript

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

3
ขอบคุณ! วิธีการแก้ปัญหานี้คือสิ่งที่ฉันกำลังมองหาเป็นการส่วนตัวเพราะฉันต้องการที่จะใส่ JSON เว้าแหว่งใน <textarea>
Turbo

2
สิ่งนี้ดีกว่าเพราะคุณใช้ฟังก์ชันจาวาสคริปต์พื้นฐานเท่านั้นที่ไม่ต้องการการคำนวณเพิ่มเติมซึ่งอาจทำให้เกิดปัญหาประสิทธิภาพหากการดำเนินการซ้ำหลายครั้ง สิ่งเดียวที่ฉันใช้งานไม่ได้คือแท็ก <pre>
CL

สมบูรณ์แบบและสิ่งที่ฉันกำลังมองหา! สั้นหวานและตรงประเด็น
John

ว้าว! ขอบคุณ! มันมีประโยชน์มากสำหรับฉัน
พิพากษา

29

จากคำตอบของ 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);
}

นี่คือ bookmarklet ที่คุณสามารถใช้ได้:

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 ไม่รองรับการหลบหนี% ในคอนโซล แปลก ... บางทีมันอาจจะใช้ได้ในอนาคต

ไชโย!

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันใช้รหัส ur แต่ฉันได้รับผลลัพธ์ในรูปแบบ json แต่ฉันไม่ได้รับสีและในที่สุดฉันได้รับแท็กสีนี้เป็นผลลัพธ์ {"ข้อผิดพลาด": {"รหัส": 0, "ข้อความ": "O"}}, สี: สีแดง, สี: สีแดง, สี: darkorange
ramesh027

25
var jsonObj = {"streetLabel": "Avenue Anatole France", "city": "Paris 07",  "postalCode": "75007", "countryCode": "FRA",  "countryLabel": "France" };

document.getElementById("result-before").innerHTML = JSON.stringify(jsonObj);

ในกรณีที่แสดงเป็น HTML คุณควรเพิ่ม balise <pre></pre>

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

ตัวอย่าง:


1
"สมดุลย์" คืออะไร?
Dan Dascalescu

มันหมายถึง "แท็ก" ในภาษาฝรั่งเศส
Aymeric Bouzy aybbyk

<pre>เป็นต้องถ้าคุณแสดง JSON <div>ในส่วน โหวตขึ้นสำหรับคำใบ้นั้นเท่านั้น!
มานูเอล

23

ฉันใช้ส่วนขยาย JSONView Chrome (มันสวยเท่าที่จะได้รับ :):

แก้ไข: เพิ่มแล้ว jsonreport.js

ฉันยังได้เปิดตัว jsonreport.js โปรแกรมดูภาพสวย ๆ ออนไลน์ JSON ซึ่งให้รายงาน HTML5 ที่มนุษย์สามารถอ่านได้คุณสามารถใช้เพื่อดูข้อมูล JSON ใด ๆ

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับรูปแบบในรูปแบบรายงาน JavaScript HTML5ใหม่


1
ฉันต้องการไลบรารี Javascript * .js ที่สามารถพิมพ์สตริง JSON เพื่อเพิ่มองค์ประกอบและคลาส html ได้ บางอย่างเช่น var result = prettyPrint ('{"key": "value"}');
ทำเครื่องหมาย

21

คุณสามารถใช้ซึ่งเป็นทางลัดสำหรับconsole.dir() console.log(util.inspect())(ความแตกต่างเพียงอย่างเดียวคือมันข้ามinspect()ฟังก์ชันแบบกำหนดเองใด ๆ ที่กำหนดไว้บนวัตถุ)

มันใช้การเน้นไวยากรณ์ , การเยื้องอย่างชาญฉลาด , ลบคำพูดออกจากปุ่มและเพียงแค่ทำให้ผลลัพธ์ที่ได้รับ

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})}))"


มีวิธีใดที่จะได้รับมันจึงเริ่มขยายตัว?
Daniel Sokolowski

@DanielSokolowski หมายถึงอะไร
adius

ในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของ Chrome ฉันต้องคลิกสามเหลี่ยมเล็ก ๆ เพื่อไปยังคีย์วัตถุ th, วิธีใดที่จะขยายอัตโนมัติ? snag.gy/7wPqsl.jpg
Daniel Sokolowski

Mh คำถามที่ดี. ฉันไม่รู้ตัว แต่จะเป็นประโยชน์จริง ๆ …
adius

9

ต่อไปนี้เป็น HTML อันยอดเยี่ยมของ user123444555621 ที่ปรับให้เหมาะกับหน้าจอ มีประโยชน์สำหรับการดีบักสคริปต์ Node:

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);

7

สำหรับวัตถุประสงค์ในการแก้ไขข้อบกพร่องฉันใช้:

console.debug ("% o" ข้อมูล);

3
-1; สิ่งนี้เทียบเท่ากับการทำconsole.debug(data);ใน (อย่างน้อย) Chrome และ Firefox มันไม่ได้แสดงการเป็นตัวแทนของ JSON dataนับประสาพิมพ์สวย
Mark Amery

1
@MarkAmery 2 ปีที่ผ่านมาคุณลักษณะนี้ใหม่สำหรับเบราว์เซอร์และทำงานตามที่ฉันอธิบายเท่านั้น ถ้าคุณยังเด็กเกินไป - ฉันมีความสุขสำหรับคุณ! นอกจากนี้ไวยากรณ์เช่นconsole.debug("%s: %o x %d", str, data, cnt);อาจยังเป็นประโยชน์กับใครบางคน
gavenkoa

2
ยังดูconsole.dirที่ช่วยให้นำทางข้อมูล
Christophe Roussy

7

ไม่พอใจกับเครื่องพิมพ์อื่น ๆ สวยสำหรับ Ruby ผมเขียนของตัวเอง ( NeatJSON ) แล้วรังเพลิงมัน JavaScriptรวมทั้งจัดรูปแบบออนไลน์ฟรี รหัสฟรีภายใต้ใบอนุญาต MIT (ค่อนข้างอนุญาต)

คุณสมบัติ (อุปกรณ์เสริม):

  • ตั้งค่าความกว้างของบรรทัดและตัดในวิธีที่เก็บวัตถุและอาร์เรย์ในบรรทัดเดียวกันเมื่อพวกเขาพอดีห่อหนึ่งค่าต่อบรรทัดเมื่อพวกเขาไม่
  • เรียงลำดับปุ่มวัตถุถ้าคุณชอบ
  • จัดแนววัตถุคีย์ (จัดแนวโคลอน)
  • จัดรูปแบบตัวเลขทศนิยมเป็นจำนวนทศนิยมเฉพาะโดยไม่ทำให้จำนวนเต็มยุ่งเหยิง
  • โหมดการตัด 'สั้น' ทำให้การเปิดและปิดวงเล็บ / วงเล็บปีกกาในบรรทัดเดียวกับค่าให้รูปแบบที่บางคนต้องการ
  • การควบคุมระยะห่างอย่างละเอียดสำหรับอาร์เรย์และวัตถุระหว่างวงเล็บเหลี่ยมก่อน / หลังเครื่องหมายโคลอนและเครื่องหมายจุลภาค
  • มีฟังก์ชั่นให้ใช้งานได้กับทั้งเว็บเบราว์เซอร์และ Node.js

ฉันจะคัดลอกซอร์สโค้ดที่นี่เพื่อไม่ได้เป็นเพียงลิงค์ไปยังไลบรารี แต่ฉันแนะนำให้คุณไปที่หน้าโปรเจ็กต์ GitHubเพราะจะได้รับการอัพเดตและโค้ดด้านล่างจะไม่ถูกเก็บไว้

(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);

5

ขอบคุณมาก @ ทั้งหมด! ขึ้นอยู่กับคำตอบก่อนหน้านี้ต่อไปนี้เป็นวิธีการชุดตัวเลือกอื่นที่ให้กฎการแทนที่แบบกำหนดเองเป็นพารามิเตอร์:

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

อาร์กิวเมนต์ "rr" คืออะไร?
manking

1
@manking ... กฎ = $ .extend (กฎ ('วัตถุ' === typeof rr)? rr: {}); ... มันคือการขยาย ruleset โดยวัตถุ rulset (บางทีคุณอาจพบการอัปเดต: github.com/frdl/-Flow/blob/master/api-d/4/js-api/library.js/… )
webfan



4

ฉันพบปัญหาในวันนี้ด้วยรหัสของ @ Pumbaa80 ฉันกำลังพยายามใช้ไวยากรณ์ JSON ที่เน้นข้อมูลที่ฉันแสดงในมุมมองMithrilดังนั้นฉันต้องสร้างโหนด DOM สำหรับทุกสิ่งในJSON.stringifyผลลัพธ์

ฉันแบ่ง regex ที่ยาวมาก ๆ ออกเป็นส่วน ๆ

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 ที่นี่


4

นี่คือองค์ประกอบรูปแบบ / สี 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

หวังว่าจะช่วย!


4

คุณสามารถใช้JSON.stringify(your object, null, 2) พารามิเตอร์ที่สองสามารถใช้เป็นฟังก์ชั่นทดแทนซึ่งใช้คีย์และ Val เป็นพารามิเตอร์ซึ่งสามารถใช้ในกรณีที่คุณต้องการแก้ไขบางอย่างภายในวัตถุ JSON ของคุณ

การอ้างอิงเพิ่มเติม: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify


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

3

หากคุณกำลังมองหาห้องสมุดที่ดีที่จะนำเสนอ json บนหน้าเว็บ ...

Prism.js ค่อนข้างดี

http://prismjs.com/

ฉันพบว่าใช้ JSON.stringify (obj, undefined, 2) เพื่อรับการเยื้องแล้วใช้ปริซึมเพื่อเพิ่มธีมเป็นวิธีที่ดี

หากคุณกำลังโหลดใน JSON ผ่านการโทร ajax คุณสามารถเรียกใช้หนึ่งในวิธีอรรถประโยชน์ของ Prism เพื่อทำการ prettify

ตัวอย่างเช่น:

Prism.highlightAll()

1

นี่เป็นสิ่งที่ดี:

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

1

ไม่พบโซลูชันใด ๆ ที่มีการเน้นไวยากรณ์ที่ดีสำหรับคอนโซลดังนั้นนี่คือ 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"]});

เอาท์พุต


0

ผมขอแนะนำให้ใช้HighlightJS จะใช้หลักการเดียวกันเป็นคำตอบที่ได้รับการยอมรับ แต่ยังสามารถใช้งานสำหรับภาษาอื่น ๆ อีกมากมายและมีกำหนดไว้ล่วงหน้าหลายรูปแบบสี หากใช้RequireJSคุณสามารถสร้างโมดูลที่เข้ากันได้กับ

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

การสร้างอาศัย Python3 และ Java เพิ่ม-nเพื่อสร้างเวอร์ชันที่ไม่ย่อเล็กสุด


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

0

วิธีที่ง่ายที่สุดในการแสดงวัตถุสำหรับการดีบัก:

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

หากคุณต้องการแสดงวัตถุใน DOM คุณควรพิจารณาว่ามันอาจมีสตริงที่จะตีความว่าเป็น HTML ดังนั้นคุณต้องหลบหนี ...

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

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

0

เพื่อเน้นและตกแต่งในการHTMLใช้งานBootstrap:

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>";
        }
    );
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.