我可以在json文件里使用注释吗? 如果是的话,怎么写?


当前回答

您可以通过正则表达式使用简单的预处理。例如,以下函数将在php中解码注释json:

function json_decode_commented ($data, $objectsAsArrays = false, $maxDepth = 512, $opts = 0) {
  $data = preg_replace('~
    (" (?:[^"\\\\] | \\\\\\\\ | \\\\")*+ ") | \# [^\v]*+ | // [^\v]*+ | /\* .*? \*/
  ~xs', '$1', $data);

  return json_decode($data, $objectsAsArrays, $maxDepth, $opts);
}

它支持所有php- type 注释 : / *, , , / / 。 字符串的字典被保存 。

其他回答

注释不是官方标准,尽管有些分析者支持 c++- 风格的注释。

// Configuration options
{
    // Default encoding for text
    "encoding" : "UTF-8",

    // Plug-ins loaded at start-up
    "plug-ins" : [
        "python",
        "c++",
        "ruby"
        ],

    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
}

jsonlint 不验证这一点 。 因此, 批注是解析器特定的扩展名, 而不是标准 。

另一本书是Json5。

取代json Toml的替代品。

另一种选择是jsonc。

Nlohmann/json的最新版本有选择的支持,

如果你用杰克森做你的杰森采摘师 那么这就是你如何让它 允许评论:

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);

然后,你可以有这样的评论:

{
  key: "value" // Comment
}

并且也可以从设置开始有评论:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

但一般而言(如以前回答的)规格不允许提出评论。

是的,你可以有评论。 但我不建议任何上述理由。

我做了一些调查,我发现所有json都要求使用 json.parse 方法的方法。所以我找到了一个解决办法: 我们可以控制或修补猴子绕着json.parse。

注:仅用节点/js 测试;-)

var oldParse = JSON.parse;
JSON.parse = parse;
function parse(json){
    json = json.replace(/\/\*.+\*\//, function(comment){
        console.log("comment:", comment);
        return "";
    });
    return oldParse(json)
}

json 文件 :

{
  "test": 1
  /* Hello, babe */
}

json 规格不支持评论, // 或/ * * / 样式。

但一些 Json 剖析图书馆和助手支持它们。

类似 :

json5 视觉演播室 代码评论

json 的作者希望我们把评论写进json里, 但是在解析之前先把评论删掉( 见 Michael Burr 提供的链接 ) 。 如果json 有评论的话, 为什么不将评论标准化, 让 Json 牧师来做工作? 我不同意这里的逻辑, 但是, 可惜, 这就是标准。 使用其他人建议的山药解决方案是好的, 但是它需要图书馆的依赖性 。

如果您想要删除注释, 但不想有图书馆依赖性, 这里是一个双线解决方案, 用于 c++- 风格的注释, 但可以适应其它选项 :

var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

请注意,只有在您可以确定json数据不含评论启动器的情况下,例如('/'),才能使用这一解决方案。

实现 json 解析、 解析评论和不增加图书馆的另一种方法, 就是用 javascript 解释器来评价json 。 当然, 这个方法的提醒是, 您只想要评价未污染的数据( 不可信用户- 输入 ) 。 这是在 node. js 中的一个例子-- 另一个警告, 以下示例将只读过一次数据, 然后它会被缓存 :

data = require(fs.realpathSync(doctree_fp));