Nodejs:读取文件时是否有任何库可以清除JSON(例如注释)?

3

我正在使用 require("fs")在Node.js中读取json文件。

类似这样:

var readJsonFromFile= function(fileLocation, callback){
      fs.readFile(fileLocation, 'utf8', function (err, data) {
          if (err) {
            return callback(err);
          }

          data = JSON.parse(data);
          callback(null,data);
    });
}

然而,我注意到 JSON.parse:

  • 不允许注释 // bla/* blaa */
  • 需要键用引号括起来。

虽然我知道这在技术上是正确的,但我想知道是否存在任何小型库,可以清理我的经常带注释的 JSON 文件以保证以上要求。(不,这并不完全是 DIY,考虑到 // 是有效值的一部分等等。)

谢谢

3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
4

是的!我使用Kyle Simpson的JSON.minify来实现这个目的:

https://github.com/getify/JSON.minify

它不是一个完整的Node模块,但它非常适用于加载类似JSON的配置文件等。请注意,您仍然需要引用您的键,但它允许注释。
var config = JSON.parse(JSON.minify(fs.readFileSync(configFileName, 'utf8')));

只是为了完整起见:这只解决了注释问题,而不是“引用”问题。解析器实际上需要在键和值上都使用双引号。尽管如此,仍然在使用它。 - Geert-Jan
这个模块是否扩展了全局 JSON 对象?对于这么微不足道的事情似乎是不必要的。我希望它是一个“完整的”模块。无论如何,你不是还需要 require 它吗? - Cory Gross
@CoryGross 你必须以某种方式加载它。require()是一种常见的方法,或者我想你可以将文件内容放入你的文件中,但我没有看到使用require()加载它有任何不利之处。此外,这里没有任何膨胀,你可以自己查看源代码。https://github.com/getify/JSON.minify/blob/master/minify.json.js 如果你不喜欢这种方法,你总可以自己编写一个。 - Brad

2

HJSON 满足所有这些要求。

  • 它是一个 NPM 包
  • 它可以处理 // 注释
  • 它可以处理 /* */ 注释
  • 它可以处理未引用的键。

你可以在线尝试它

示例文本:

{
  # specify rate in requests/second (because comments are helpful!)
  rate: 1000

  // prefer c-style comments?
  /* feeling old fashioned? */

  # did you notice that rate doesn't need quotes?
  hey: look ma, no quotes for strings either!

  # best of all
  notice: []
  anything: ?

  # yes, commas are optional!
}

HJSON看起来很不错。我希望它们有更多的语言实现和一个正式的语法规范像json.org一样。 - Andrey Tarantsov
同意。边缘情况的行为(主要是由于未引用键值)也可能会发生变化。 - Steve Bennett

-1

只需使用 JS-YAML解析您的JSON文件。 YAML是JSON的超集,支持您想要的功能。

如果您不想使用任何特定于YAML的内容在配置文件中,请仅将YAML解析器用作修复三个烦人问题(注释,引号和尾随逗号)的JSON解析器即可。

它甚至还配有一个命令行工具,可以将YAML转换为纯粹的JSON:

~> echo "{ foo: 10, bar: [20, 30], }" | js-yaml -j /dev/stdin
{
  "foo": 10,
  "bar": [
    20,
    30
  ]
}

你的例子确实有效,但是当我使用更复杂的文件 cat config.json|js-yaml -j /dev/stdin 时,它输出的是纯YAML,而不是JSON。 - RushPL
YAML是JSON的超集,但它不是OP粘贴的JSON超集(包括两种格式的Javascript注释)的超集。 - Steve Bennett
@SteveBennett 确实。我是在解决底层需求(“在我的配置文件中有注释”),但如果需要特定的注释语法,YAML 将无法帮助。 - Andrey Tarantsov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,