是否有任何JSON漂亮的打印机需要格外小心?

时间:2011-05-16 00:56:01

标签: javascript json line word-wrap pretty-print

我想要一台JSON漂亮的打印机,可以识别阵列或物体何时适合一条线并且只是这样做。例如:

{
  "fits": ["JSON", "pretty", "printer"],
  "longer": [
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????",
    "???????????????????????????????????????????????????"
  ]
}

是否有像这样的独立库?如果没有,我将如何写一个?

我最感兴趣的是JavaScript实现。

3 个答案:

答案 0 :(得分:0)

我不知道任何这种简洁的JSON打印机,但如果您想要自己制作自己应该不难:

  • 您可以使用for(property in object)迭代给定对象的属性。
    • 根据使用情况,您可能希望使用hasOwnProperty进行过滤。
  • 您可以使用typeof
  • 确定引用是否指向对象,数组,字符串或数字
  • 让漂亮的打印机功能接收初始缩进偏移量和要打印的对象。这可能足以决定是否应该内联每个属性。
    • 我不确定这种“贪婪”策略总是“最优” - 或许现在可以更好地在多行中做一些事情以便以后能够内联。起初我不会担心这个。

答案 1 :(得分:0)

由于JSON主要是一种数据传输格式,我认为你的意思是在浏览器中查看原始JSON?如果是这样,那么有几个选择:

如果您需要进一步定制,您应该能够深入了解最后三个来源。我首先遍历value.length属性,其中value是数组元素,看看是否可以将输出限制为单行。

答案 2 :(得分:0)

使用replacer function将每个键/值对中的字符总数与固定长度进行比较。这是一个简单的例子:

function replacer(key, value)
  {
  var key_arr = [];
  var value_arr = [];
  var i = 0;
  for (_ in value)
    {
    key_arr.push(_);
    value_arr.push(value[_]);
    }
  for(;i < value_arr.length;i++)
    {
    if (key_arr[i].length + value_arr[i].length < 80)
      {
      console.log(key_arr[i] + ":" + "\t" + value_arr[i])
      }
    else
      {
      console.log(key_arr[i] + ":" + "\n" + value_arr[i])
      }
    }
  }

用法:

var json;

json = {"foo":"1","bar":"2"},      
JSON.stringify(json, replacer, 4);

json = {"foo":"12345678901234567890123456789012345678901234567890123456789012345678901234567890","bar":"2"};

JSON.stringify(json, replacer, 4);