我正在尝试将以下格式化为JSON(在Python中):
{
"sessionTimeout":"3600.0",
"serverVersion":"LK_LK-NL-7_188-176-419",
"worldDawn":"2018-10-09 06:00:00 Etc/GMT",
"Data":{
"Player":[
{
"nick":"Player11226400",
"points":"44",
"alliancePermission":"0",
"isOnVacation":"false",
"id":"5048",
"rank":"561",
"entityName":"Player",
},
{
"nick":"Player11230580",
"points":"15",
"alliancePermission":"0",
"isOnVacation":"false",
"id":"5215",
"rank":"2081",
"entityName":"Player",
},
{
"nick":"Player11291581",
"points":"15",
"alliancePermission":"0",
"isOnVacation":"false",
"id":"5942",
"rank":"2081",
"entityName":"Player",
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
每个JSON验证器当然告诉我这是无效的JSON,因为在每个}之前有",",所以我想删除那个逗号.我尝试用.replace('"播放器",","播放器"')删除它们,但我不认为这是一个很好的解决方案.这是因为我还有一个尾随","例如一个联盟或Habitat字符串("人居","联盟",)
谁能帮助我找到更好的解决方案来解决这个问题?
两种解决方案
第一个,如果您的json文件没有,那么很酷null或者false/true布尔将会读取使用ast.literal_eval哪个可以处理这些逗号的输入,然后根据需要将dict转储回json:
d = ast.literal_eval(txt)
print(json.dumps(d,indent=4))
Run Code Online (Sandbox Code Playgroud)
如果你不能,你可以使用正则表达式删除在换行符之前发生的逗号,如果下一行以空格+结束括号/括号开头:
import re
print(json.loads(re.sub(",(\n\s+[\}\]])",r"\1",txt)))
Run Code Online (Sandbox Code Playgroud)
这是一个完整的代码片段,其中包含2个方法,其中包含您输入的简化版本:
import ast,json
txt = """{
"sessionTimeout":"3600.0",
"serverVersion":"LK_LK-NL-7_188-176-419",
"worldDawn":"2018-10-09 06:00:00 Etc/GMT",
"Data":{
"Player":[
{
"nick":"Player11226400",
"rank":"561",
"entityName":"Player",
},
{
"nick":"Player11230580",
"rank":"2081",
"entityName":"Player",
},
{
"nick":"Player11291581",
"rank":"2081",
"entityName":"Player",
}
]
}
}"""
print("ast literal eval:")
d = ast.literal_eval(txt)
print(json.dumps(d,indent=4))
import re
print("regex:")
d = json.loads(re.sub(",(\n\s+[\}\]])",r"\1",txt))
print(json.dumps(d,indent=4))
Run Code Online (Sandbox Code Playgroud)
两种方法都成功解析了您的输入文件.只要没有空指针和布尔值,第一种方法就可以完美地工作,第二种方法可能会在一些模糊的格式化案例中失败.如果运气不好,你可以在两者之间进行破解.
由于JSON是YAML的子集,允许使用悬空逗号,因此您可以在此处使用yaml解析器.
pip install pyyaml
Run Code Online (Sandbox Code Playgroud)
该库具有load与标准库类似的功能json.loads.
import json, yaml
json.dumps(yaml.load(jsondata))
Run Code Online (Sandbox Code Playgroud)
您也可以使用ast.literal_eval此特定数据.但是,与pyyaml不工作,如果你的JSON中包含的文字false,true或null值.
| 归档时间: |
|
| 查看次数: |
727 次 |
| 最近记录: |