簡體   English   中英

如何從JSON對象提取Python對象?

[英]How to extract Python object from JSON object?

我可以按原樣從Python對象獲取JSON字符串:

def myserialize(obj):
    return obj.__dict__

class A:
    def __init__(self):
        self._filename = AString()
        self._size = AnInt()
        self.objectString = ObjectContainingAString()
        self.arrayOfObject = ....
    def get_json_string(self):
        return json.dumps(self.__dict__,default=myserialize,indent=4,sort_keys=True)

JSON輸出如下所示

{
    "_filename" : "value_of_string"
    "_size" : value_of_int
    "objectString": {
        "string" : "value_of_string"
    }
    "arrayOfObject" : [
         {
             "obj1" : {
             ...
             }
         },
         {
             "obj2"...
         }
     ]
}

這正是我想要的! 一種將Python“復雜”對象轉換為JSON字符串的簡單方法。

問題:但現在,我想將此字符串轉換為相同的“復雜” Python對象!

場景:場景是我還有一些(不同的)“復雜”對象,我想從JSON字符串來回轉換。

如果您提供的解決方案必須以某種方式在字符串中包含ID,則表明“這僅是XYZ類型的對象的JSON字符串”是可以的,因為我只有幾個“復雜”對象(5/6)。

編輯1

完整方案 :我有6個二進制文件,其中包含嵌入式軟件的配置。 這顯然不是人類可讀的。

我目前正在使用Python解析二進制文件並提取其內容以獲得易於閱讀的版本。 (JSON或其他東西!)JSON至少具有將Python對象轉換為一行包含所有有關一個配置文件的信息的優勢。

人們現在應該能夠在(JSON或其他)文本配置文件中編輯一些值。

我希望能夠將文本文件轉換回相應的Python對象,並對其進行序列化以獲得修改后的二進制文件!

編輯結束

我看到的最簡單的可重用解決方案涉及兩個步驟:

  1. 將json解析回python字典(該字典處理類型轉換),並且可以在類的構造函數之外完成
  2. (可選)將python詞典輸入類的構造函數中,並在指定時使用它用setattr填充類的字段

這是表達為python代碼的相同想法:

class A:
    def __init__(self, input_dict=None):

        if input_dict is not None:
            for k, v in input_dict.items():
                setattr(self, k, v)
        else:

            self._filename = AString()
            self._size = AnInt()
            self.objectString = ObjectContainingAString()
            self.arrayOfObject = ....

        ...

# Assume we have a list of json strings created by your json export
# Now parse json strings and turn them into objects of class A
for json_str in json_strs:
  new_object = A(input_dict=json.loads(json_str))
  # Do something with new_object...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM