Python 在JSON中序列化/反序列化简单但嵌套的对象

Python 在JSON中序列化/反序列化简单但嵌套的对象,python,object,json-serialization,Python,Object,Json Serialization,我正在尝试将配置从客户端传输到服务器 配置包含一个我不能传输的密码密钥 Config包含两个简单的对象,它们只是键/值对(值是一个基本原语) 此代码适用于: 类空: 通过 类配置: 定义初始化(自): #我不想在互联网上传播 自我保密P@ssw0rd' def创建(自我,foo): self.foo=foo#传入的属性 self.bar=f'Hello{foo}'#计算属性 #有两个自定义对象,但它们很简单 #(仅包含值为基本原语的键/值对) self.v=Empty() 自我价值=1 se

我正在尝试将配置从客户端传输到服务器

  • 配置包含一个我不能传输的
    密码
    密钥
  • Config包含两个简单的对象,它们只是键/值对(值是一个基本原语)
此代码适用于:

类空:
通过
类配置:
定义初始化(自):
#我不想在互联网上传播
自我保密P@ssw0rd'
def创建(自我,foo):
self.foo=foo#传入的属性
self.bar=f'Hello{foo}'#计算属性
#有两个自定义对象,但它们很简单
#(仅包含值为基本原语的键/值对)
self.v=Empty()
自我价值=1
self.w=Empty()
自我保护。w.b=2
def导出_json(自身):
J={}
对于变量(self.items())中的k,v:
如果k=='secret':
持续
J[k]=变量(v)如果是恒量(v,为空)否则v
返回J
def从_json(self,J_str)构造_:
J=json.loads(J_str)
对于J.items()中的k,v:
如果存在(v,dict):
_=空()
对于k_u,v_u在v.items()中:
setattr(u,k,v)
v=_
setattr(自、k、v)
测试:
```蟒蛇
c=Config()
c、 创建('123')
J=c.export_json()
打印('序列化:')
打印(json.dumps(J,缩进=4))
d=Config()
d、 从_json(J)构造_
打印('w.b=',d.w.b)
输出:

Serialized:
{
    "foo": "123",
    "bar": "Hello 123",
    "v": {
        "b": 2
    },
    "w": {
        "b": 2
    }
}
Reconstructed: w.b =  2

但是,有没有更好的/pythonic的方法来实现这一点?

正如评论中提到的,您可能只想使用这里的
pickle
库来避免自己序列化/反序列化,并且,如果您添加嵌套结构/etc或希望忽略其他属性,则避免在将来对序列化代码进行重大修改。下面是一个与
pickle
一起工作的代码版本,同时不序列化
secret
属性

类空:
通过
类配置:
定义初始化(自):
#我不想在互联网上传播
自我保密P@ssw0rd'
def创建(自我,foo):
self.foo=foo#传入的属性
self.bar=f'Hello{foo}'#计算属性
#有两个自定义对象,但它们很简单
#(仅包含值为基本原语的键/值对)
self.v=Empty()
自我价值=1
self.w=Empty()
自我保护。w.b=2
#这将获得酸洗的状态。注意我们是如何显式删除的
#内部字典中的'secret'属性。你不需要
#还有别的事吗
定义获取状态(自身):
state=self.\u dict\u.copy()
德尔州[“秘密”]
返回状态
测试它:

导入pickle
c=Config()
c、 创建('123')
J=酸洗倾倒(c)
打印(“序列化:”,J)
d=酸洗负荷(J)
印刷品(“重建的水下建筑:”,d.w.b)
打印(“重建机密:”,d.secret)
这是它产生的输出(如所需):

序列化:b'\x80\x04\x95m\x00…(截断)'
重建后的水污染指数:2
回溯(最近一次呼叫最后一次):
文件“/Users/mustafa/scratch/test.py”,第36行,在
打印(“重建机密:”,d.secret)
AttributeError:'Config'对象没有属性'secret'

你看过
pickle
了吗?如果你必须使用JSON,你可以试着做
JSON.dumps(state)
(其中
state
与上面的代码相同),但是这会更烦人,因为你需要再次显式地处理嵌套值。
Serialized:  b'\x80\x04\x95m\x00...(truncated)'
Reconstructed w.b: 2
Traceback (most recent call last):
  File "/Users/mustafa/scratch/test.py", line 36, in <module>
    print("Reconstructed secret:", d.secret)
AttributeError: 'Config' object has no attribute 'secret'