JSON: правильное размещение вложений
Я использую JSON для вывода группы классов.
Проблема, которую я пытаюсь решить, заключается в том, каков наилучший способ вывода json для вложенного класса. Следующий простой пример выдвигает на первый план проблему.
# python 3.x
import json
class Class1:
def __init__(self):
self.a = 'this'
self.b = 33
def toJSON(self):
return json.dumps({'a': self.a,
'b': self.b},
sort_keys=False, indent=2, separators=(',', ': '))
class Class2:
def __init__(self):
self.x = 'hello'
self.y = Class1()
self.z = 'world'
def toJSON(self):
return json.dumps({'x': self.x,
'y': self.y.toJSON(),
'z': self.z},
sort_keys=False, indent=2, separators=(',', ': '))
if __name__ == '__main__':
a = Class2()
print(a.toJSON())
Это вывод, который я получаю. Который содержит управляющие символы
{
"x": "hello",
"y": "{\n \"a\": \"this\",\n \"b\": 33\n}",
"z": "world"
}
Это вывод, который я хотел бы выглядеть примерно так
{
"x":"hello",
"y":{
"a":"this",
"b":33
},
"z":"world"
}
Будем очень благодарны любой помощи.
2 ответа
Решение
Я думаю, что вы могли бы реализовать кодировщик cls и затем передать cls в функцию json.dumps, как в следующем примере.
import json
class Class1:
def __init__(self):
self.a = 'this'
self.b = 33
class Class2:
def __init__(self):
self.x = 'hello'
self.y = Class1()
self.z = 'world'
class ComplexEncoder(json.JSONEncoder):
def default(self, obj):
if hasattr(obj, '__dict__'):
return obj.__dict__
else:
return json.JSONEncoder.default(self, obj)
if __name__ == '__main__':
a = Class2()
print(json.dumps(a, cls=ComplexEncoder, sort_keys=False, indent=2, separators=(',', ': ')))
Вы выгружаете JSON как строку. Загрузка как JSON, а затем возврат поможет
# python 3.x
import json
class Class1:
def __init__(self):
self.a = 'this'
self.b = 33
def toJSON(self):
return json.loads(json.dumps({'a': self.a,
'b': self.b},
sort_keys=False, indent=4, separators=(',', ': ')))
class Class2:
def __init__(self):
self.x = 'hello'
self.y = Class1()
self.z = 'world'
def toJSON(self):
return json.loads(json.dumps({'x': self.x,
'y': self.y.toJSON(),
'z': self.z},
sort_keys=False, indent=2, separators=(',', ': ')))
if __name__ == '__main__':
a = Class2()
print(a.toJSON())
Выход:
{'x': 'hello', 'y': {'a': 'this', 'b': 33}, 'z': 'world'}