json.loads可以忽略尾随逗号吗?

Rob*_*tts 28 python json python-2.7

正如提到这个StackOverflow的问题,你都不允许有任何尾随逗号JSON.例如,这个

{
    "key1": "value1",
    "key2": "value2"
}
Run Code Online (Sandbox Code Playgroud)

很好,但是这个

{
    "key1": "value1",
    "key2": "value2",
}
Run Code Online (Sandbox Code Playgroud)

是无效的语法.

由于其他StackOverflow问题中提到的原因,在Python代码中使用尾随逗号是合法的(也许是鼓励?).我正在使用Python和JSON,所以我希望能够在两种类型的文件中保持一致.有没有办法json.loads忽略尾随逗号?

Any*_*Dev 20

快进到 2021 年,现在我们有了https://pypi.org/project/json5/

引用链接中的一段话:

JSON5 数据格式的 Python 实现。

JSON5 扩展了 JSON 数据交换格式,使其作为配置语言更加可用:

  • JavaScript 风格的注释(单行和多行)是合法的。
  • 如果对象键是合法的 ECMAScript 标识符,则可以不加引号
  • 对象和数组可能以逗号结尾。
  • 字符串可以用单引号引起来,并且允许多行字符串文字。

用法与python内置的json模块一致:

>>> import json5
>>> json5.loads('{"key1": "{my special value,}",}')
{u'key1': u'{my special value,}'}
Run Code Online (Sandbox Code Playgroud)

它确实带有警告:

已知的问题

  • 我有没有提到它很慢?

它对于加载启动配置等来说足够快。


小智 8

在传递值之前删除逗号.

import re

def clean_json(string):
    string = re.sub(",[ \t\r\n]+}", "}", string)
    string = re.sub(",[ \t\r\n]+\]", "]", string)

    return string
Run Code Online (Sandbox Code Playgroud)

  • 不.您不解析使用正则表达式允许嵌套元素的格式.-1 (8认同)
  • 这可能看起来不错,但它会破坏像`'{"foo": ",}"}'`这样的输入。 (2认同)

小智 8

在python中,您可以在字典和列表中使用尾随逗号,因此我们应该能够使用ast.literal_eval来利用这一点

import ast, json

str = '{"key1": "value1", "key2": "value2",}'

python_obj = ast.literal_eval(str) 
# python_obj is {'key1': 'value1', 'key2': 'value2'}

json_str = json.dumps(python_obj)
# json_str is '{"key1": "value1", "key2": "value2"}'
Run Code Online (Sandbox Code Playgroud)

但是,JSON 并不完全是Python,因此有一些边缘情况。例如,python 中不存在null、true、false等值。我们可以在运行 eval 之前用有效的 python 等效项替换它们:

import ast, json

def clean_json(str):
  str = str.replace('null', 'None').replace('true', 'True').replace('false', 'False')
  return json.dumps(ast.literal_eval(str))
Run Code Online (Sandbox Code Playgroud)

不幸的是,这将破坏任何包含null、true 或 false字样的字符串。

{"sentence": "show your true colors"} 
Run Code Online (Sandbox Code Playgroud)

会成为

{"sentence": "show your True colors"}
Run Code Online (Sandbox Code Playgroud)


Ste*_*mer 5

你可以用jsoncomment包装python的json解析器

JSON Comment允许使用以下内容解析JSON文件或字符串:

  • 单行和多行注释
  • 多行数据字符串
  • 在最后一项之后,在对象和数组中尾随逗号

用法示例:

import json
from jsoncomment import JsonComment

with open(filename) as data_file:    
    parser = JsonComment(json)
    data = parser.load(data_file)
Run Code Online (Sandbox Code Playgroud)

  • 那个包不是很好。它也从字符串中删除逗号。只要有一个包含 `,}` 或 `,]` 的字符串,逗号就会神奇地消失。 (2认同)
  • @Sven 看起来他们升级到了正确的解析并放弃了正则表达式:https://github.com/vaidik/commentjson/releases (2认同)