日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

利用Python實現(xiàn)Json序列化庫的方法步驟

瀏覽:6日期:2022-07-11 18:16:26

前言

在Python的世界里,將一個對象以json格式進行序列化或反序列化一直是一個問題。Python標準庫里面提供了json序列化的工具,我們可以簡單的用json.dumps來將一個對象序列化。但是這種序列化僅支持python內(nèi)置的基本類型。

利用Python實現(xiàn)Json序列化庫的方法步驟Python

在Python的世界里,將一個對象以json格式進行序列化或反序列化一直是一個問題。Python標準庫里面提供了json序列化的工具,我們可以簡單的用json.dumps來將一個對象序列化。但是這種序列化僅支持python內(nèi)置的基本類型,對于自定義的類,我們將得到Object of type A is not JSON serializable的錯誤。

有很多種方法可以用來支持這種序列化,這里有一個很長的關(guān)于這個問題的討論。總結(jié)起來,基本上有兩種還不錯的思路:

利用標準庫的接口:從python標準json庫中的JSONDecoder繼承,然后自定義實現(xiàn)一個default方法用來自定義序列化過程 利用第三方庫實現(xiàn):如jsonpickle jsonweb json-tricks等

利用標準庫的接口的問題在于,我們需要對每一個自定義類都實現(xiàn)一個JSONDecoder.default接口,難以實現(xiàn)代碼復用。

利用第三方庫,對我們的代碼倒是沒有任何侵入性,特別是jsonpickle,由于它是基于pickle標準序列化庫實現(xiàn),可以實現(xiàn)像pickle一樣序列化任何對象,一行代碼都不需要修改。

但是我們觀察這類第三方庫的輸出的時候,會發(fā)現(xiàn)所有的這些類庫都會在輸出的json中增加一個特殊的標明對象類型的屬性。這是為什么呢?Python是一門動態(tài)類型的語言,我們無法在對象還沒有開始構(gòu)建的時候知道對象的某一屬性的類型信息,為了對反序列化提供支持,看起來確實是不得不這么做。

有人可能覺得這也無可厚非,似乎不影響使用。但是在跨語言通信的時候,這就成為了一個比較麻煩的問題。比如我們有一個Python實現(xiàn)的API,客戶端發(fā)送了一個json請求過來,我們想在統(tǒng)一的一個地方將json反序列化為我們Python代碼的對象。由于客戶端不知道服務(wù)器端的類型信息,json請求里面就沒法加入這樣的類型信息,這也就導致這樣的類庫在反序列化的時候遇到問題。

能不能有一個相對完美的實現(xiàn)呢?先看一下我們理想的json序列化庫的需求:

我們希望能簡單的序列化任意自定義對象,只添加一行代碼,或者不加入任何代碼 我們希望序列化的結(jié)果不加入任何非預期的屬性 我們希望能按照指定的類型進行反序列化,能自動處理嵌套的自定義類,只需要自定義類提供非常簡單的支持,或者不需要提供任何支持 我們希望反序列化的時候能很好的處理屬性不存在的情況,以便在我們加入某一屬性的時候,可以設(shè)置默認值,使得舊版本的序列化結(jié)果可以正確的反序列化出來

如果有一個json庫能支持上面的四點,那就基本是比較好用的庫了。下面我們來嘗試實現(xiàn)一下這個類庫。

對于我們想要實現(xiàn)的幾個需求,我們可以建立下面這樣的測試來表達我們所期望的庫的API設(shè)計:

class A(JsonSerializable):def __init__(self, a, b):super().__init__()self.a = aself.b = b if b is not None else B(0)@propertydef id(self):return self.adef _deserialize_prop(self, name, deserialized):if name == ’b’:self.b = B.deserialize(deserialized)returnsuper()._deserialize_prop(name, deserialized)class B(JsonSerializable):def __init__(self, b):super().__init__()self.b = bclass JsonSerializableTest(unittest.TestCase):def test_model_should_serialize_correctly(self):self.assertEqual(json.dumps({’a’: 1, ’b’: {’b’: 2}}), A(1, B(2)).serialize())def test_model_should_deserialize_correctly(self):a = A.deserialize(json.dumps({’a’: 1, ’b’: {’b’: 2}}))self.assertEqual(1, a.a)self.assertEqual(2, a.b.b)def test_model_should_deserialize_with_default_value_correctly(self):a = A.deserialize(json.dumps({’a’: 1}))self.assertEqual(1, a.a)self.assertEqual(0, a.b.b)

這里我們希望通過繼承的方式來添加支持,這將在反序列化的時候提供一個好處。因為有了它我們就可以直接使用A.deserialize方法來反序列化,而不需要提供任何其他的反序列化函數(shù)參數(shù),比如這樣json.deserialize(serialized_str, A)。

同時為了驗證我們的框架不會將@property屬性序列化或者反序列化,我們特意在類A中添加了這樣一個屬性。

由于在反序列化的時候,框架是無法知道某一個對象屬性的類型信息,比如測試中的A.b,為了能正確的反序列化,我們需要提供一點簡單的支持,這里我們在類A中覆蓋實現(xiàn)了一個父類的方法_deserialize_prop對屬性b的反序列化提供支持。

當我們要反序列化一個之前版本的序列化結(jié)果時,我們希望能正確的反序列化并使用我們提供的默認值作為最終的反序列化值。這在屬性A.b的測試中得到了體現(xiàn)。

(上面的測試有很多邊界的情況、支持的變量類型并沒有覆蓋,此測試只是作為示例使用。)

如果能有一個類可以讓上面的測試通過,相信那個類就是我們所需要的類了。這樣的類可以實現(xiàn)為如下:

def is_normal_prop(obj, key):is_prop = isinstance(getattr(type(obj), key, None), property)is_func_attr = callable(getattr(obj, key))is_private_attr = key.startswith(’__’)return not (is_func_attr or is_prop or is_private_attr)def is_basic_type(value):return value is None or type(value) in [int, float, str, bool]class JsonSerializable:def _serialize_prop(self, name):return getattr(self, name)def _as_dict(self):props = {}for key in dir(self):if not is_normal_prop(self, key):continuevalue = self._serialize_prop(key)if not (is_basic_type(value) or isinstance(value, JsonSerializable)):raise Exception(’unknown value to serialize to dict: key={}, value={}’.format(key, value))props[key] = value if is_basic_type(value) else value._as_dict()return propsdef serialize(self):return json.dumps(self._as_dict(), ensure_ascii=False)def _deserialize_prop(self, name, deserialized):setattr(self, name, deserialized)@classmethoddef deserialize(cls, json_encoded):if json_encoded is None:return Noneargs = inspect.getfullargspec(cls)args_without_self = args.args[1:]obj = cls(*([None] * len(args_without_self)))data = json.loads(json_encoded, encoding=’utf8’) if type(json_encoded) is str else json_encodedfor key in dir(obj):if not is_normal_prop(obj, key):continueif key in data:obj._deserialize_prop(key, data[key])return obj

在實現(xiàn)時,我們利用了Python的內(nèi)省機制,這樣就可以自動的識別對象的屬性及運行時類型了。當然對于這個簡單的類還有很多待支持的功能,使用上也有很多限制,比如:

當某一屬性為自定義類的類型的時候,需要子類覆蓋實現(xiàn)_deserialize_prop方法為反序列化過程提供支持 當某一屬性為由自定義類構(gòu)成的一個list tuple dict復雜對象時,需要子類覆蓋實現(xiàn)_deserialize_prop方法為反序列化過程提供支持 簡單屬性必須為python內(nèi)置的基礎(chǔ)類型,比如如果某一屬性的類型為numpy.float64,序列化反序列化將不能正常工作

雖然有上述限制,但是這正好要求我們在做模型設(shè)計的時候保持克制,不要將某一個對象設(shè)計得過于復雜。比如如果有屬性為dict類型,我們可以將這個dict抽象為另一個自定義類型,然后用類型嵌套的方式來實現(xiàn)。

到這里這個基類就差不多可以支撐我們?nèi)粘5拈_發(fā)需要了。當然對于這個簡單的實現(xiàn)還有可能有其他的需求或者問題,大家如有發(fā)現(xiàn),歡迎留言交流。

總結(jié)

到此這篇關(guān)于利用Python實現(xiàn)Json序列化庫的文章就介紹到這了,更多相關(guān)Python實現(xiàn)Json序列化庫內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品麻豆| 亚洲手机视频| 亚洲精品影院在线观看| 亚洲一区二区三区免费在线观看 | 亚洲乱亚洲高清| 亚洲香蕉视频| 亚洲精品无吗| 国产日韩欧美中文在线| 国产精品资源| 久久精品国产在热久久| 国产精品中文| 麻豆精品久久久| 成人在线视频免费看| 中文在线中文资源| 日韩高清成人| 中文亚洲欧美| 日本精品在线播放| 精品国产欧美日韩| 樱桃视频成人在线观看| 1000部精品久久久久久久久| 亚洲免费精品| 日本成人中文字幕| 美日韩一区二区三区| 国产成人免费视频网站视频社区| 国产精品精品国产一区二区| 天堂精品久久久久| 国产视频一区二| 国产精品久久| 亚洲www免费| 麻豆9191精品国产| 国产亚洲欧美日韩精品一区二区三区| 精品一区二区三区中文字幕| 久久男人天堂| 久久国产精品毛片| 国产日韩欧美三区| 91偷拍一区二区三区精品| 久久激情网站| 午夜久久av| 不卡专区在线| 手机精品视频在线观看| 久久国产免费看| 91欧美日韩| 在线国产精品一区| 久久精品国产久精国产爱| 国产91一区| 日本一区福利在线| 97精品国产福利一区二区三区| 99热免费精品| 国产色99精品9i| 亚洲国产成人二区| 欧美专区18| 国产乱子精品一区二区在线观看| 国产精品亚洲一区二区三区在线观看| 国产精品毛片在线看| 久久av偷拍| 欧美日韩一二| 清纯唯美亚洲综合一区| 午夜av成人| 日韩精品亚洲一区二区三区免费| 国产一区二区三区黄网站| 日韩视频精品在线观看| 国产精品久久久久久妇女| 欧美一级精品| 日韩高清在线不卡| 久久美女精品| 国产日产一区| 亚洲精品在线观看91| 国产精品二区影院| 亚洲欧美日本国产专区一区| 精品视频高潮| 亚洲一区二区小说| 国产精品成人a在线观看| 日韩中文字幕1| 超碰在线99| 国产欧美高清视频在线| 亚洲一区二区免费看| 色网在线免费观看| 欧美日韩中文| 亚洲一区二区毛片| 日韩精品免费一区二区在线观看 | 免费看的黄色欧美网站| 激情国产在线| 国产精品jk白丝蜜臀av小说| 石原莉奈在线亚洲二区| 国产a亚洲精品| 91成人在线精品视频| 亚洲激情黄色| 99久久夜色精品国产亚洲1000部| 国产精品2023| 日韩高清电影一区| 男女性色大片免费观看一区二区| 欧美sm一区| 久久精品国产999大香线蕉| 亚洲精品麻豆| 免费精品视频最新在线| 国户精品久久久久久久久久久不卡| 国产中文欧美日韩在线| 欧美日韩一区二区三区在线电影| 亚洲中午字幕| 国产美女高潮在线| 欧美激情麻豆| 国产精品一区二区精品视频观看| 亚洲精品日本| 免费一级片91| 伊人精品视频| 亚洲黑丝一区二区| 久久蜜桃精品| 日本精品在线中文字幕| 国产精品精品| аⅴ资源天堂资源库在线| 大香伊人久久精品一区二区| 美女国产一区二区三区| 国产精品啊v在线| 国产精品毛片视频| 欧美日韩视频免费看| 日韩精品国产欧美| 啪啪亚洲精品| 国产亚洲精品美女久久| 欧美日韩一区二区三区在线电影| 91九色综合| 奇米777国产一区国产二区| 日韩欧美中文在线观看| 亚洲精品少妇| 日韩欧美中文在线观看| 日韩欧美2区| 国产亚洲精品美女久久 | 久久久久国产精品一区二区| 欧洲av不卡| 亚洲二区免费| 欧美女激情福利| 亚洲免费一区二区| 亚洲丝袜啪啪| 日韩福利视频网| 欧美伊人久久| 美女高潮久久久| 狠狠躁少妇一区二区三区| 丁香六月综合| 久久理论电影| 久久亚洲色图| 中文字幕中文字幕精品| 日韩精品久久理论片| 国产精品一区二区美女视频免费看 | 国产一区二区三区四区二区| 国产黄大片在线观看| 日韩一区自拍| 不卡在线一区二区| 首页国产欧美日韩丝袜| 91亚洲精品视频在线观看| 91精品一区| 日本一二区不卡| 韩日一区二区三区| 亚洲影院天堂中文av色| 国产精品一区二区三区av| 亚洲黄色网址| 国产农村妇女精品一区二区| 亚洲精品影视| 国产精品15p| 国产综合色区在线观看| 亚洲激情精品| 97久久超碰| 免费亚洲一区| 99久久99视频只有精品| 日韩中文字幕区一区有砖一区| 日本少妇一区二区| 不卡福利视频| 亚洲综合小说| 国产夫妻在线| 免费看日韩精品| 狠狠久久伊人| 亚洲欧美日本视频在线观看| 国产欧美日韩免费观看| 日本久久成人网| 亚州国产精品| 精品国产精品国产偷麻豆 | 国产色播av在线| 亚洲一区二区三区免费在线观看| 欧美日韩一区二区三区四区在线观看| 国产91在线播放精品| 亚洲一区二区三区四区五区午夜| 91精品美女| 欧美日韩在线播放视频| 日韩精品亚洲专区在线观看| sm捆绑调教国产免费网站在线观看 | 丝袜a∨在线一区二区三区不卡| 国产麻豆一区二区三区精品视频| 日本在线精品| 一区二区91| 亚洲国产福利| 日韩精品导航| 亚洲网站视频| 国产精品1区| 噜噜噜久久亚洲精品国产品小说| 麻豆国产91在线播放| 亚洲在线电影| 亚洲综合电影| 国产精品丝袜在线播放| 最新国产拍偷乱拍精品| 国产精品男女| 婷婷综合社区| 久久精品国产福利|