I'm trying to format the following as JSON (in 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",
}
]
}
}
Every JSON validator of course tells me that this is not valid JSON because of the trailing "," before each }, so I want to remove that comma. I tried removing them with .replace('"Player",", '"Player"') but I don't consider this as a good solution. This because I also have trailing "," in for example a Alliance or Habitat string ("Habitat", & "Alliance",)
Could anyone help me with finding a better solution to this problem?
Two solutions:
First one, cool if your json file doesn't have null
or false/true
booleans would be to read the input using ast.literal_eval
which can process those commas, then dump back the dict as json if needed:
d = ast.literal_eval(txt)
print(json.dumps(d,indent=4))
if you can't, you can use a regex to remove commas that happen before a newline if the next line starts with spaces + closing braces/brackets:
import re
print(json.loads(re.sub(",(\n\s+[\}\]])",r"\1",txt)))
here's a full snippet containing the 2 approaches with a cut-down version of your input:
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))
both methods successfully parse your input file. The first method will work flawlessly as long as there are no null pointers & booleans, the second method may fail in some obscure formatting cases. In case of bad luck, you can hack something in between.
Since JSON is a subset of YAML, where dangling commas are permitted, you can use a yaml parser here.
pip install pyyaml
The library has a load
function, similar to the standard library json.loads
.
import json, yaml
json.dumps(yaml.load(jsondata))
You can also use ast.literal_eval
for this particular data. But unlike pyyaml
that doesn't work if your json contains literal false
, true
or null
values.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With