【问题标题】:How to convert Object with Properties to JSON without "_" in Python 3?如何在 Python 3 中将具有属性的对象转换为没有“_”的 JSON?
【发布时间】:2015-08-04 15:18:12
【问题描述】:

我想将 Python 对象转换为 JSON 格式。

User 类的私有属性是使用属性定义的。方法to_Json()我找到了here

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 之前的所有键(请参阅 here)不是一种实用的方法,因为我的类比上面的示例更复杂。

那么,尽可能快地将 Python 对象转换为 JSON 格式的最佳做法是什么?

【问题讨论】:

    标签: python json


    【解决方案1】:

    如果您发布的示例代码反映了您的真实代码,那么这些属性根本没有任何理由。你可以这样做:

    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)
    

    【讨论】:

    • 我想使用属性进行一些值检查或进一步格式化。感谢您提供代码 sn-p。
    【解决方案2】:

    在 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 属性,您将破坏其中一个。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题,但我有两个下划线字符的私有字段。

      class User:
          def __init__(self, id, name):
              self.id = id
              self.name = name
      
          @property
          def id(self):
              return self.__id
      
          @id.setter
          def id(self, id):
              self.__id = id
      
          @property
          def name(self):
              return self.__name
      
          @name.setter
          def name(self, name):
              self.__name = name
      

      因此,我的json编码器略有不同

      from json import JSONEncoder
      
      
      def beautify_key(str):
          index = str.index('__')
          if index <= 0:
              return str
      
          return str[index + 2:]
      
      
      class JsonEncoder(JSONEncoder):
      
          def default(self, o):
              return {beautify_key(k): v for k, v in vars(o).items()}
      

      完整答案是here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-17
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        • 2016-12-28
        相关资源
        最近更新 更多