[英]How to convert Object with Properties to JSON without “_” in Python 3?
我想将Python对象转换为JSON格式。
类User的私有属性是使用属性定义的。 我在这里找到了方法to_Json()
class User:
def __init__(self):
self._name = None
self._gender = None
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
@property
def gender(self):
return self._gender
@gender.setter
def gender(self, gender):
self._gender = gender
def to_Json(self):
return json.dumps(self, default=lambda o: o.__dict__, allow_nan=False, sort_keys=False, indent=4)
使用此类和方法的输出是:
{
"_name": "Peter",
"_age": 26
}
什么是摆脱JSON格式下划线的最简单方法? (我想要“name”而不是“_name”)删除类中的下划线不是一个选项,因为我收到一个错误(最大递归深度)。 我认为重命名属性的方法可以解决这个问题,但这是最好的解决方案吗?
在json.dumbs之前重命名所有键(见这里 )并不是一个实用的方法,因为我的类比上面的例子更复杂。
那么,尽可能快地将Python对象转换为JSON格式的最佳做法是什么?
如果您发布的示例代码镜像您的实际代码,那么根本没有任何理由可以使用这些属性。 你可以这样做:
class User(object):
def __init__(self):
self.name = None
self.age = None
因为你并没有真正隐藏下划线和属性后面的用户的任何东西。
如果您确实需要进行转换,我喜欢在自定义编码器中执行此操作:
class MyEncoder(json.JSONEncoder):
def default(self, o):
return {k.lstrip('_'): v for k, v in vars(o).items()}
json_encoded_user = json.dumps(some_user, cls=MyEncoder)
在Python中,通常不使用属性作为基本属性。 您可以将name
和age
保留为可直接访问的属性。 除非您在获取或设置时需要转换数据,否则无需将它们包装在property
对象中。
如果您有充分的理由使用带下划线的属性但将它们反映为JSON词典,则可以在转换为字典时转换字典:
object_dict = lambda o: {key.lstrip('_'): value for key, value in o.__dict__.items()}
return json.dumps(self, default=object_dict, allow_nan=False, sort_keys=False, indent=4)
请注意,这对防止冲突没有任何作用。 如果您的实例上同时具有_name
和name
属性,那么您将破坏其中一个或另一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.