我正在尝试将以下格式设置为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",
}
]
}
}
当然,每个JSON验证程序都会告诉我这不是有效的JSON,因为每个}后面都带有“,”,因此我想删除该逗号。我尝试使用.replace('“ Player”,“,'” Player“')删除它们,但我认为这不是一个很好的解决方案,因为我在例如Alliance或Habitat字符串中也有结尾的”,“ (“人居”和“联盟”,)
有人可以帮助我找到更好的解决方案吗?
答案 0 :(得分:7)
两种解决方案:
第一个,很酷,如果您的json文件中没有null
或false/true
布尔值,则可以使用ast.literal_eval
来读取输入,它可以处理这些逗号,然后转储字典作为json(如果需要):
d = ast.literal_eval(txt)
print(json.dumps(d,indent=4))
如果不能,则可以使用正则表达式删除换行符之前出现的逗号(如果下一行以空格+大括号/括号括起来)
import re
print(json.loads(re.sub(",(\n\s+[\}\]])",r"\1",txt)))
下面是完整的代码段,其中包含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))
两个方法都成功解析了您的输入文件。只要没有空指针和布尔值,第一种方法就可以完美地工作,第二种方法在某些晦涩的格式化情况下可能会失败。万一运气不好,您可以在这两者之间破解。
答案 1 :(得分:6)
由于JSON是YAML的子集,允许使用悬挂的逗号,因此您可以在此处使用yaml解析器。
pip install pyyaml
该库具有load
函数,类似于标准库json.loads
。
import json, yaml
json.dumps(yaml.load(jsondata))
您也可以将ast.literal_eval
用于此特定数据。但是与pyyaml
不同的是,如果您的json包含文字false
,true
或null
值,则无法正常工作。
答案 2 :(得分:0)
使用python的json模块将python字典导出到有效的json:
import json
json.dumps(<your-dict>)