【问题标题】:Print JSON parsed object?打印 JSON 解析的对象?
【发布时间】:2011-06-23 10:10:15
【问题描述】:

我有一个已使用 JSON.parse 解析为 JSON 的 javascript 对象我现在想打印该对象以便调试它(该函数出现问题)。当我执行以下操作时...

for (property in obj) {
    output += property + ': ' + obj[property]+'; ';
}
console.log(output);

我列出了多个 [object Object]。我想知道如何打印它以查看内容?

【问题讨论】:

  • 作为旁注, for (property in obj) 将列出所有属性,甚至包括继承的属性。因此,对于 Object.prototype 和任何“母类”,您会得到很多无关紧要的东西。这对 json 对象很不方便。您必须使用 hasOwnProperty() 过滤它们以仅获取此对象拥有的属性。

标签: javascript json parsing printing


【解决方案1】:

你知道 JSON 代表什么吗? JavaScript 对象表示法。它为对象提供了很好的格式。

JSON.stringify(obj) 将返回对象的字符串表示形式。

【讨论】:

  • 我很惊讶这个答案在底部......这应该是公认的答案:-)
  • 如果您不想要字符串表示,而是想要在代码编辑器中显示的对象怎么办?
  • @SuperUberDuper: ...那么你现在就不会尝试构建字符串表示了,对吧。 :)
  • 我相信 SuperUberDuper 是在询问是否可以在不将其转换为字符串的情况下记录或查看对象。如果在浏览器中查看 DOM 需要一个元素,您可以将 json 字符串化,并将元素内容 innerHTML 设置为该字符串以在页面上查看它。
  • 例如:import Json from './data.json'; var el = document.createElement('div'); el.innerHTML = JSON.stringify(Json);
【解决方案2】:

大多数调试器控制台都支持直接显示对象。只需使用

console.log(obj);

根据您的调试器,这很可能会将控制台中的对象显示为折叠树。您可以打开树并检查对象。

【讨论】:

  • 值得一提的是,在 chrome(可能还有其他浏览器)中,当与这样的字符串组合时:console.log("object: " + obj) 它不会显示对象,而是会输出“object: [Object obj]” .
  • @Shahar console.log("object: %O", obj) (Chrome) 或 console.log("object: %o", obj) (Firefox|Safari) 将让您访问对象详细信息,请参阅下面的答案。
  • @DaveAnderson 对控制台中的对象格式进行了很好的拍摄。
  • @Shahar 谢谢,你的就是我需要的信息。应该添加到答案中。
  • 除了@DaveAnderson 的方法,使用逗号将字符串与对象分开也可以:console.log("My object: ", obj)
【解决方案3】:

如果您想要一个带有缩进的漂亮的多行 JSON,那么您可以使用 JSON.stringify 及其第三个参数:

JSON.stringify(value[, replacer[, space]])

例如:

var obj = {a:1,b:2,c:{d:3, e:4}};

JSON.stringify(obj, null, "    ");

JSON.stringify(obj, null, 4);

会给你以下结果:

"{
    "a": 1,
    "b": 2,
    "c": {
        "d": 3,
        "e": 4
    }
}"

在浏览器中 console.log(obj) 做得更好,但在 shell 控制台 (node.js) 中则不然。

【讨论】:

    【解决方案4】:

    尝试console.dir() 而不是console.log()

    console.dir(obj);
    

    MDN 表示console.dir() 支持:

    • FF8+
    • IE9+
    • 歌剧
    • 野生动物园

    【讨论】:

    • 仅在 IE9+ 中可用
    • console.dir() 也可用于 FF8+、Opera、Chrome 和 Safari:developer.mozilla.org/en-US/docs/Web/API/console.dir
    • 太棒了!这对我来说是最好的解决方案。谢谢。
    • node js 呢?
    • 不错,但不支持像log("string" + variable)这样的字符串拼接
    【解决方案5】:

    要打印 JSON 解析的对象,只需键入

    console.log( JSON.stringify(data, null, " ") );

    你会得到非常清晰的输出

    【讨论】:

      【解决方案6】:

      使用字符串格式;

      console.log("%s %O", "My Object", obj);
      

      Chrome 有 Format Specifiers 和以下内容;

      • %s 将值格式化为字符串。
      • %d%i 将值格式化为 一个整数。
      • %f 将值格式化为浮点值。
      • %o 将值格式化为可扩展的 DOM 元素(如 元素面板)。
      • %O 将值格式化为可扩展的 JavaScript 目的。
      • %c 根据你的 CSS 样式格式化输出字符串 提供。

      Firefox 也有 String Substitions 有类似的选项。

      • %o 输出到 JavaScript 对象的超链接。点击链接会打开一个检查器。
      • %d%i 输出一个整数。尚不支持格式化。
      • %s 输出一个字符串。
      • %f 输出一个浮点值。尚不支持格式化。

      Safari 有printf style formatters

      • %d%i 整数
      • %[0.N]f 精度为 N 位的浮点值
      • %o对象
      • %s字符串

      【讨论】:

      • 不错的参考答案
      • %O 真的很有帮助
      • 仅供参考,在 Firefox 中,%O 现在似乎输出为控制台内的可扩展对象。
      【解决方案7】:

      又好又简单:

      console.log("object: %O", obj)
      

      【讨论】:

      • 您能描述一下 %O 的用途吗?具体应该是O吗? - 你的解决方案就像一个魅力
      • O 代表对象,所以只要对象可以作为字符串打印,它应该可以毫无问题地打印。这有助于我在许多不确定错误出在哪里的情况下进行故障排除
      • 这里忘记告知了,其实我们不需要使用%O。我们可以直接使用 console.log("object: ", obj) 谢谢@mbenhalima
      • 那么这与接受的答案相同。
      【解决方案8】:

      随便用

      console.info("CONSOLE LOG : ")
      console.log(response);
      console.info("CONSOLE DIR : ")
      console.dir(response);
      

      你会在 chrome 控制台中得到这个:

      CONSOLE LOG : 
      facebookSDK_JS.html:56 Object {name: "Diego Matos", id: "10155988777540434"}
      facebookSDK_JS.html:57 CONSOLE DIR : 
      facebookSDK_JS.html:58 Objectid: "10155988777540434"name: "Diego Matos"__proto__: Object
      

      【讨论】:

        【解决方案9】:

        如果你想调试为什么不使用控制台调试

        window.console.debug(jsonObject);
        

        【讨论】:

          【解决方案10】:

          警告对象或数组内容的简单函数。
          使用数组或字符串或对象调用此函数,它会提醒内容。

          功能

          function print_r(printthis, returnoutput) {
              var output = '';
          
              if($.isArray(printthis) || typeof(printthis) == 'object') {
                  for(var i in printthis) {
                      output += i + ' : ' + print_r(printthis[i], true) + '\n';
                  }
              }else {
                  output += printthis;
              }
              if(returnoutput && returnoutput == true) {
                  return output;
              }else {
                  alert(output);
              }
          }
          

          用法

          var data = [1, 2, 3, 4];
          print_r(data);
          

          【讨论】:

            【解决方案11】:

            以下代码将在警告框中显示完整的json数据

            var data= '{"employees":[' +
            '{"firstName":"John","lastName":"Doe" },' +
            '{"firstName":"Anna","lastName":"Smith" },' +
            '{"firstName":"Peter","lastName":"Jones" }]}';
            
            json = JSON.parse(data);
            window.alert(JSON.stringify(json));
            

            【讨论】:

              【解决方案12】:

              如果您在服务器上使用 js 工作,那么只需多做一点体操就会有很长的路要走……这是我的 ppos(pretty-print-on-server):

              ppos = (object, space = 2) => JSON.stringify(object, null, space).split('\n').forEach(s => console.log(s));
              

              当我编写服务器代码时,它在创建我可以实际阅读的内容方面做得非常出色。

              【讨论】:

                【解决方案13】:

                我不知道它是如何从未正式制作的,but I've added my own json methodconsole 对象以便于打印字符串化日志:

                在 javascript 中观察对象(非基元)有点像量子力学。你“测量”的可能不是真实的状态,它已经改变了。

                console.json = console.json || function(argument){
                    for(var arg=0; arg < arguments.length; ++arg)
                        console.log(  JSON.stringify(arguments[arg], null, 4)  )
                }
                
                // use example
                console.json(   [1,'a', null, {a:1}], {a:[1,2]}    )

                很多时候需要查看对象的字符串化版本,因为按原样(原始对象)打印它会打印对象的“实时”版本,该版本会随着程序的进行而发生变化,并且不会反映状态对象在记录的时间点,例如:

                var foo = {a:1, b:[1,2,3]}
                
                // lets peek under the hood
                console.log(foo) 
                
                // program keeps doing things which affect the observed object
                foo.a = 2
                foo.b = null
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-08-21
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-03-13
                  • 2018-09-11
                  • 2021-10-15
                  • 1970-01-01
                  相关资源
                  最近更新 更多