簡體   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