如何用c风格的注释解析json文件?

时间:2015-04-30 04:45:07

标签: python json

我有一个json文件,如下所示:

    { 
       "author":"John",
       "desc": "If it is important to decode all valid JSON correctly \ 
and  speed isn't as important, you can use the built-in json module,   \
 orsimplejson.  They are basically the same but sometimes simplej \
further along than the version of it that is included with \
distribution."
       //"birthday": "nothing" //I comment this line
    }

此文件由其他程序自动创建。我如何用Python解析它?

9 个答案:

答案 0 :(得分:5)

我无法想象一个json文件"由其他程序自动创建" 将包含注释。因为json spec根本没有定义任何注释,那就是by design,所以没有json库会输出带注释的json文件。

这些评论通常会在以后由人类添加。在这种情况下也不例外。 OP在他的帖子中提到了//"birthday": "nothing" //I comment this line

所以真正的问题应该是,如何正确评论json文件中的某些内容,同时保持其与规范的兼容性,从而与其他json库兼容?

答案是,将您的字段重命名为其他名称。例如:

{
    "foo": "content for foo",
    "bar": "content for bar"
}

可以改为:

{
    "foo": "content for foo",
    "this_is_bar_but_been_commented_out": "content for bar"
}

这大部分时间都可以正常工作,因为消费者很可能会忽略意外字段(但并非总是如此,这取决于您的json文件使用者的实现。所以YMMV。)

更新:显然有些读者不满意,因为这个答案没有给出解决方案"他们期待。嗯,实际上,我确实通过隐式链接到JSON designer's quote

来提供有效的解决方案
  

Douglas Crockford Public 2012年4月30日评论JSON

     

我从JSON中删除了评论,因为我看到有人使用它们   持有解析指令,这种做法本来就会被破坏   互操作性。我知道缺乏评论会让一些人知道   伤心,但不应该。

     

假设您正在使用JSON来保存配置文件   想要注释。继续,插入您喜欢的所有评论。   然后通过JSMin将其传递给JSON解析器。

所以,是的,继续使用JSMin。请记住,当您前往"使用JSON"中的注释时,这是一个概念上未知的领域。无法保证您选择的任何工具都可以处理:内联[1,2,3,/* a comment */ 10],Python样式[1, 2, 3] # a comment(这是Python中的注释但不是Javascript中的注释),INI样式[1, 2, 3] ; a comment,... ,你明白了。

我仍然建议不要首先在JSON中添加不合规的注释。

答案 1 :(得分:5)

jsoncomment很好,但不支持内联评论。

查看jstyleson,哪个支持

  • 内联评论
  • 单行评论
  • 多行评论
  • 尾随逗号。

实施例

安装

pip install jstyleson

用法

import jstyleson
result_dict = jstyleson.loads(invalid_json_str) # OK
jstyleson.dumps(result_dict)

答案 2 :(得分:4)

我没有亲自使用它,但jsoncomment python包支持使用注释解析JSON文件。

您可以使用它代替JSON解析器,如下所示:

parser = JsonComment(json)
parsed_object = parser.loads(jsonString)

答案 3 :(得分:3)

我建议大家改用 JSON5 库。 JSON5 是具有 JavaScript 功能/支持的 JSON。它是世界上最流行的 JSON 语言扩展。它有注释、支持对象/数组中的尾随逗号、支持单引号键/字符串、支持不带引号的对象键等。还有适当的解析器库和深度测试套件,一切正常。

有两种不同的高质量 Python 实现:

这是 JSON5 规范:https://json5.org/

答案 4 :(得分:0)

commentjson怎么样?

http://commentjson.readthedocs.io/en/latest/

这可以解析下面的内容。

{
    "name": "Vaidik Kapoor", # Person's name
    "location": "Delhi, India", // Person's location

    # Section contains info about
    // person's appearance
    "appearance": {
        "hair_color": "black",
        "eyes_color": "black",
        "height": "6"
    }
}

可能是弹性搜索,某些产品的REST API不接受评论字段。因此,我认为json中的注释对于客户端来说是必要的,以便维护诸如json模板。

EDITED

jsmin似乎更常见。

https://pypi.python.org/pypi/jsmin

答案 5 :(得分:0)

对于所有被RayLuo找到接受答案的人来说,比说明问题更令人沮丧:

JSON发明者推荐的理由

  

先将其通过JSMin传递给JSON解析器

是Java的minification将去除注释的JSON(Java的子集)。这样一来,您就可以毫无问题地将其输入到常规解析器中。

答案 6 :(得分:0)

如果您像我一样喜欢避免使用外部库,那么我编写的此函数将从文件中读取json并删除“ //”和“ / * * /”类型的注释:

def GetJsonFromFile(filePath):
    contents = ""
    fh = open(filePath)
    for line in fh:
        cleanedLine = line.split("//", 1)[0]
        if len(cleanedLine) > 0 and line.endswith("\n") and "\n" not in cleanedLine:
            cleanedLine += "\n"
        contents += cleanedLine
    fh.close
    while "/*" in contents:
        preComment, postComment = contents.split("/*", 1)
        contents = preComment + postComment.split("*/", 1)[1]
    return contents

答案 7 :(得分:0)

如果您并不是真正在乎严格的按书JSON格式,而只是希望有一些可以在JSON中进行注释的内容,那么您可以看一下Json5。例如,该库可让您解析JSON5:https://pypi.org/project/json5/

答案 8 :(得分:0)

简而言之:使用jsmin

pip安装jsmin

import json
from jsmin import jsmin

with open('parameters.jsonc') as js_file:
    minified = jsmin(js_file.read())
parameters  = json.loads(minified)