删除方括号之间的所有最后一个逗号

时间:2018-10-08 08:49:21

标签: python json

我正在尝试将以下格式设置为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字符串中也有结尾的”,“ (“人居”和“联盟”,)

有人可以帮助我找到更好的解决方案吗?

3 个答案:

答案 0 :(得分:7)

两种解决方案:

第一个,很酷,如果您的json文件中没有nullfalse/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包含文字falsetruenull值,则无法正常工作。

答案 2 :(得分:0)

使用python的json模块将python字典导出到有效的json:

import json
json.dumps(<your-dict>)