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)
小智 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)
你可以用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)
| 归档时间: |
|
| 查看次数: |
9356 次 |
| 最近记录: |