繁体   English   中英

如何在Python 3中将没有“_”的带有属性的对象转换为JSON?

[英]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中,通常使用属性作为基本属性。 您可以将nameage保留为可直接访问的属性。 除非您在获取或设置时需要转换数据,否则无需将它们包装在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)

请注意,这对防止冲突没有任何作用。 如果您的实例上同时具有_namename属性,那么您将破坏其中一个或另一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM