是否有任何 JSON 漂亮的打印机需要格外注意简洁

Are there any JSON pretty-printers that take extra care to be concise?

本文关键字:简洁 打印机 任何 JSON 漂亮 是否      更新时间:2023-09-26

我想要一个漂亮的JSON打印机,它可以识别数组或对象何时适合一行并做到这一点。例:

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

有这样的独立库吗?如果没有,我将如何去写一个?

我最感兴趣的是 JavaScript 实现。

我不知道

任何如此简洁的JSON打印机,但是如果您愿意,制作自己的打印机应该不难:

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

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

    JSON
  • Lint - 检查和重新格式化 JSON
  • 上述的纯JS版本
  • 适用于 Chrome 的 JSONView
  • Safari JSON 格式化程序

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

使用替换函数将每个键/值对中的字符总数与固定长度进行比较。下面是一个简单的示例:

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