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

2024-09-29 06:34:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试将以下内容格式化为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,因为在each}之前有一个“,”,所以我想删除这个逗号。我尝试用.replace('“Player”,“,'”Player“)删除它们,但我认为这不是一个好的解决方案。这是因为我在例如Alliance或habitation字符串(“habitation”和“Alliance”,)中也有尾随“,”

有谁能帮我找到更好的解决办法吗?在


Tags: idjsonfalsenickpointsplayerranklk
3条回答

由于JSON是YAML的一个子集,允许使用悬空逗号,因此可以在这里使用YAML解析器。在

pip install pyyaml

这个库有一个load函数,类似于标准库json.loads。在

^{pr2}$

您还可以将ast.literal_eval用于此特定数据。但是与pyyaml不同的是,如果json包含文本falsetrue或{}值,那么这就不起作用了。在

两种解决方案:

首先,如果您的json文件没有null或{}布尔值,那么很酷的做法是使用可以处理这些逗号的ast.literal_eval读取输入,然后根据需要将dict作为json转储:

d = ast.literal_eval(txt)
print(json.dumps(d,indent=4))

如果不能,可以使用正则表达式删除换行符之前的逗号,如果下一行以空格+右大括号/方括号开头:

^{pr2}$

下面是一个完整的片段,其中包含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))

两个方法都成功地解析了输入文件。只要没有空指针和布尔值,第一种方法就可以完美地工作,第二种方法在某些模糊的格式化情况下可能会失败。万一运气不好,你可以在两者之间做些什么。在

使用python的json模块将python dict导出为有效的json:

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

相关问题 更多 >