如何格式化字符串以修复Javascript中的缩进?

时间:2015-03-23 22:50:24

标签: javascript jquery json parsing

我正在解析文件以制作一些文档。

我要归还的字符串是:

"([ {
                href: "sass.html",
                text: "Sass"
            }, {
                href: "components.html",
                text: "Components"
            }, {
                href: "javascript.html",
                text: "Javascript"
            } ])
            "

我想对此进行美化,以便将其输出到预标签中。所以理想的输出将是这样的:

"(
  [
    {
      href: "sass.html",
      text: "Sass"
    },
    {
      href: "components.html",
      text: "Components"
    },
    {
      href: "javascript.html",
      text: "Javascript"
    }
  ]
)"

我目前正在考虑通过以下方法删除字符串中的所有间距:

string.replace(/\s/g,'')

然后进行一系列拆分以将每条线分开并为缩进添加间距并重新加入它但这对我来说感觉很麻烦。有没有更好的方法呢?

当然,非常感谢任何建议。

这与:How can I beautify JSON programmatically?不同,因为我正在处理无效JSON上的字符串。

1 个答案:

答案 0 :(得分:1)

难点在于您所拥有的格式很奇怪,它不是有效的JSON,因此您无法直接使用JSON.parse()

由于两个原因,它无效JSON:

  1. 出于某种原因,它被()包围。
  2. 密钥不是双引号。
  3. 所以你理想的做法是首先将字符串转换为有效的JSON,然后尝试解析它。

    一个快捷方式,如果您确定,您信任这些数据,那就是首先摆脱括号,然后使用被诽谤的eval(),因为它会绕过事实上,没有引用密钥。

    这是一个单行(假设字符串在一个名为s的变量中):

    JSON.stringify(eval(s.substring(s.indexOf('(') + 1, s.lastIndexOf(')'))), null, "\t")
    

    或者将它分开:

    var pseudoJson = s.substring(s.indexOf('(') + 1, s.lastIndexOf(')'));
    JSON.stringify(eval(pseudoJson), null, "\t");