正如this StackOverflow question中提到的,json中不允许有任何尾随逗号。
{
"key1": "value1",
"key2": "value2"
}
很好,但是这个
{
"key1": "value1",
"key2": "value2",
}
是无效语法。
由于this other StackOverflow question中提到的原因,在Python代码中使用尾随逗号是法律的的(也许是鼓励的?)。我同时使用Python和JSON,所以我希望能够在两种类型的文件中保持一致。有没有办法让json.loads
忽略尾随逗号?
7条答案
按热度按时间zpqajqem1#
快进到2021年,现在我们有了https://pypi.org/project/json5/
引用链接:
JSON5数据格式的Python实现。
JSON5扩展了JSON数据交换格式,使其作为配置语言更易于使用:
用法与python内置的json模块一致:
它确实有一个警告:
已知问题
加载启动配置等足够快。
kyvafyod2#
可以用jsoncomment Package python的json解析器
JSON注解允许解析JSON文件或字符串:
示例用法:
ltskdhd13#
在传入值之前去掉逗号。
n3h0vuf24#
在python中,你可以在字典和列表中使用尾随逗号,所以我们应该可以使用ast.literal_eval来利用这一点:
然而,JSON并不是“精确的”python,因此存在一些边缘情况。例如,像 null,true,false 这样的值在python中并不存在。我们可以在运行eval之前用有效的python等效值替换它们:
不幸的是,这会损坏任何包含单词 null、true或false 的字符串。
会变成
iyfjxgzm5#
我综合了其他几个答案的知识,特别是使用@Porkbutts答案中的
literal_eval
的想法,提出了一个非常邪恶的解决方案在将JSON结构体作为Python代码求值之前,将缺少的常量定义为Python值,这样就可以从
locals()
(另一个字典)访问该结构体。这应该适用于Python 2.7和Python 3.x
小心这将执行传递文件中的任何内容,这可能会做Python解释器所能做的任何事情,所以它应该只用于已知安全的输入(即,不要让Web客户端提供内容),并且可能不在任何生产环境中使用。
如果它被赋予了大量的内容,这可能也会失败。
后期增编:这种(糟糕的)方法的一个副作用是,它支持JSON(类似JSON?)数据中的Python注解,尽管很难将其与友好的非标准行为进行比较。
guykilcj6#
使用rapidjson
1rhkuytd7#
如果我没有使用任何外部模块的选项,我的典型方法是首先对输入进行净化(即删除结尾的逗号和注解),然后使用内置的JSON解析器。
下面的示例使用三个正则表达式来去除单行和多行注解,然后去除JSON输入字符串上的尾随逗号,再将其传递给内置的
json.loads
方法。