json: 嵌套输出正确的方式

json: nesting outputs the correct way

我正在使用 json 输出一堆 classes。

我要解决的问题是为嵌套 class 输出 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"
}

如有任何帮助,我们将不胜感激。

我认为您可以实现 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'}