删除括号中的所有最后一个逗号

San*_*ker 7 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",
         }
      ]
   }
}
Run Code Online (Sandbox Code Playgroud)

每个JSON验证器当然告诉我这是无效的JSON,因为在每个}之前有",",所以我想删除那个逗号.我尝试用.replace('"播放器",","播放器"')删除它们,但我不认为这是一个很好的解决方案.这是因为我还有一个尾随","例如一个联盟或Habitat字符串("人居","联盟",)

谁能帮助我找到更好的解决方案来解决这个问题?

Jea*_*bre 7

两种解决方案

第一个,如果您的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)

两种方法都成功解析了您的输入文件.只要没有空指针和布尔值,第一种方法就可以完美地工作,第二种方法可能会在一些模糊的格式化案例中失败.如果运气不好,你可以在两者之间进行破解.


Håk*_*Lid 6

由于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,truenull值.