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'}

Другие вопросы по тегам