我有一个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解析它?
答案 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 实现:
https://github.com/dpranke/pyjson5(完全用 Python 编写,速度很慢,有自己的测试套件,项目始于 2015 年,更“喜欢”)。 PyPi 页面:https://pypi.org/project/json5/
推荐: https://github.com/Kijewski/pyjson5(使用通过 Cython 编译的本地代码,速度更快,使用官方 json5 js 测试套件而不是自己的,项目于 2018 年启动)。 PyPi 页面:https://pypi.org/project/pyjson5/
这是 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似乎更常见。
答案 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)