国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java開發(fā)者的Python進(jìn)修指南:JSON利器之官方j(luò)son庫、demjson和orjson的實(shí)用指南

這篇具有很好參考價(jià)值的文章主要介紹了Java開發(fā)者的Python進(jìn)修指南:JSON利器之官方j(luò)son庫、demjson和orjson的實(shí)用指南。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

JSON

JSON作為目前最流行的傳輸格式,在Python中也有相應(yīng)的實(shí)現(xiàn)方式。由于JSON格式的文本可以跨平臺并且簡單易用,因此被廣泛傳播。因此,我們今天的主要討論內(nèi)容是如何熟練地應(yīng)用Python的JSON庫來處理將JSON映射到文本,以及如何從文本映射到對象中?,F(xiàn)在,讓我們開始探討這個(gè)話題。

官方j(luò)son庫

在Python中,官方提供了多個(gè)JSON庫,包括標(biāo)準(zhǔn)庫中的json、marshal和pickle。其中,我個(gè)人比較喜歡使用json庫,因?yàn)閜ickle存在一些反序列化漏洞,并且它處理的是二進(jìn)制類型的數(shù)據(jù)。相比之下,json更類似于我們在Java中使用的fastjson,但它們之間仍然存在一些明顯的差異。接下來,我們繼續(xù)深入了解一下。

簡單用法

import json

json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
# '["foo", {"bar": ["baz", null, 1.0, 2]}]'
print(json.dumps("\"foo\bar"))
# "\"foo\bar"
print(json.dumps('\u1234'))
# "\u1234"
print(json.dumps('\\'))
# "\\"
print(json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True))
# {"a": 0, "b": 0, "c": 0}
from io import StringIO
io = StringIO()
json.dump(['streaming API'], io)
io.getvalue()
# '["streaming API"]'

上面提到的是官方提供的一些JSON庫的示例,我們不再深入討論。現(xiàn)在,讓我們來講解一下在工作中如何使用JSON進(jìn)行對象的序列化和反序列化。

進(jìn)階用法

當(dāng)前端返回給后端一串JSON文本時(shí),我們可以使用json.loads()方法將其正確映射到Python對象中。這個(gè)過程稱為反序列化。使用對象來處理數(shù)據(jù)會更規(guī)范一些,盡管對于一些快速開發(fā)來說,直接使用字典可能更方便。不過,我可以給你演示一下如何使用對象進(jìn)行反序列化。

首先,我們可以定義一個(gè)類來表示我們要映射的對象,然后利用json.loads()方法將JSON文本轉(zhuǎn)換為字典。接著,我們可以使用字典的鍵值對來為對象的屬性賦值。這樣,我們就成功地將JSON文本映射到了對象中。讓我來給你演示一下:

{"status":1,"info":"成功","data":{"id":"52","age":"70"}}

上面是我們接收的參數(shù),我們需要對其進(jìn)行處理,將其映射到相應(yīng)的對象中。

import json

class Response_data:
    def __init__(self, id, feed_id):
        super().__init__()
        self.id = id
        self.feed_id = feed_id

class Response:

    def __init__(self, status=None, info=None, data=None) -> None:
        super().__init__()
        self.status = status
        self.info = info
        self.data = data

    def to_json(self):
        return {
            "status": self.status,
            "info": self.info,
            "data": self.data.__dict__ if self.data else None
        }

    @staticmethod
    def object_hook(d):
        if "status" in d :
            return Response(d['status'], d['info'], d['data'])
        else:
            return Response_data(d['id'],d['feed_id'])


body = '{"status":1,"info":"發(fā)布成功","data":{"id":"52","feed_id":"70"}}'

resp = json.loads(body, object_hook=Response.object_hook)
print(json.dumps(resp.to_json(),ensure_ascii=False))

在上述代碼中,我們使用了object_hook參數(shù)。object_hook參數(shù)的主要作用是用來自定義解碼函數(shù)。它的入?yún)⑹菢?biāo)準(zhǔn)反序列化后的字典,我們可以根據(jù)自己的規(guī)則將其轉(zhuǎn)換為所需的格式。

為什么我需要在object_hook中編寫if判斷呢?這是因?yàn)閛bject_hook參數(shù)在反序列化時(shí)是遞歸的。由于我的JSON文本是嵌套的結(jié)構(gòu),所以每一層嵌套都會遞歸一次。因此,我需要先封裝好Response_data,然后才能繼續(xù)封裝Response。這與Java中的JSON序列化有很大的不同。在Java中,我們不需要關(guān)注這么多細(xì)節(jié)。但是在Python中,我們不僅需要指定參數(shù)名稱,還需要處理好嵌套結(jié)構(gòu)。

如果你在解析中文時(shí)遇到問題,很可能是由于默認(rèn)的編碼格式不支持中文字符。為了解決這個(gè)問題,你可以嘗試使用ensure_ascii=False參數(shù)。通過設(shè)置這個(gè)參數(shù),可以禁用ASCII編碼,從而保留中文字符的原始形式。

多說一句

json庫是在Python2.6版中引入的,因此如果您使用的是更早版本的Python,您可以通過PyPI獲取simplejson庫來實(shí)現(xiàn)相同的功能。

json 類型轉(zhuǎn)換到 python 的類型對照表:

JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None

三方j(luò)son庫

demjson

Demjson是一個(gè)Python的第三方模塊庫,它提供了編碼和解碼JSON數(shù)據(jù)的功能,并且還包含了JSONLint的格式化和校驗(yàn)功能。此外,Demjson還支持hook,可以通過decode函數(shù)配置和set_hook函數(shù)配置兩種方式進(jìn)行配置。

你可以在以下網(wǎng)址找到Demjson的Github地址:https://github.com/dmeranda/demjson。同時(shí),你也可以在官方地址http://deron.meranda.us/python/demjson/上了解更多關(guān)于Demjson的信息。

decode函數(shù)是Demjson提供的一個(gè)功能強(qiáng)大的函數(shù),它可以接受多個(gè)參數(shù),其中包括hook函數(shù)。通過鍵值對的方式指定hook函數(shù),鍵是hook函數(shù)的名稱,而值是hook函數(shù)本身。

如果你在安裝Demjson時(shí)遇到了報(bào)錯(cuò),可能是因?yàn)樾枰档蛃etuptools的版本到57.5.0。不過我就不進(jìn)行實(shí)驗(yàn)和驗(yàn)證了。

orjson

在日常的開發(fā)工作中,我們經(jīng)常需要將一些數(shù)據(jù)存儲為JSON格式。而最常用的方法是使用Python原生的JSON庫。然而,我們發(fā)現(xiàn)該庫的速度較慢,特別是當(dāng)數(shù)據(jù)量過大時(shí),使用起來非常不便。幸運(yùn)的是,我們發(fā)現(xiàn)了orjson這個(gè)強(qiáng)大的工具,它不僅支持多種類型的數(shù)據(jù)序列化,還可以根據(jù)開發(fā)者的需求進(jìn)行定制化輸出。與其他第三方JSON庫相比,orjson具有更高的效率,因此在處理大量數(shù)據(jù)時(shí),它是一個(gè)更好的選擇。

我們來看一下它是如何運(yùn)作的。下面是一個(gè)使用dataclasses模塊的示例代碼:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

# 假設(shè)您有一個(gè)包含 JSON 數(shù)據(jù)的字符串
json_data = '{"name": "xiaoyu", "age": 18}'

# 使用 orjson 反序列化 JSON 數(shù)據(jù)
import orjson

data_dict = orjson.loads(json_data)

# 將字典轉(zhuǎn)換為 Person 對象
person = Person(**data_dict)

# 現(xiàn)在,您可以像訪問對象屬性一樣訪問 person 對象的屬性
print(person.name)  # 輸出 "xiaoyu"
print(person.age)   # 輸出 18

經(jīng)過仔細(xì)觀察,我發(fā)現(xiàn)這兩種方式看起來確實(shí)非常相似,官方的JSON模塊也能實(shí)現(xiàn)相同的功能。但是當(dāng)我們嘗試將person對象轉(zhuǎn)換成字符串時(shí),官方的JSON模塊無法完成這個(gè)任務(wù),而orjson則可以輕松勝任。

orjson.dumps(person)

option參數(shù)

orjson還支持使用option參數(shù)來定制序列化的結(jié)果。當(dāng)然,還有很多其他的選項(xiàng)可以使用,但是由于太多了,我就不一一列舉了。不過,我可以簡單舉一個(gè)日期格式的例子,因?yàn)樵谖覀兊墓ぷ髦?,通常需要對日期格式進(jìn)行處理。

option=orjson.OPT_OMIT_MICROSECONDS: 序列化的日期時(shí)間對象將以字符串形式呈現(xiàn),而不是默認(rèn)的 ISO 8601 格式。這個(gè)選項(xiàng)在某些情況下可能更加便利,尤其是在與其他系統(tǒng)進(jìn)行數(shù)據(jù)交換時(shí)。通過使用該選項(xiàng),您可以確保日期時(shí)間對象的格式與其他系統(tǒng)的要求相匹配,從而簡化數(shù)據(jù)交換的過程。

import orjson
from datetime import datetime

data = {"name": "xiaoyu", "dob": datetime(2020, 5, 1)}
json_data = orjson.dumps(data, option=orjson.OPT_OMIT_MICROSECONDS)
print(json_data.decode())

為什么需要進(jìn)行解碼呢?原因主要在于orjson返回的是二進(jìn)制數(shù)據(jù),而我們需要將其轉(zhuǎn)換為字符串類型,因此需要進(jìn)行解碼操作。

總結(jié)

JSON是一種流行的數(shù)據(jù)傳輸格式,Python中有多種處理JSON的方式。官方的json庫是最常用的,它提供了簡單的用法來序列化和反序列化JSON文本。此外,它還支持自定義解碼函數(shù),可以將JSON映射到對象中。

在使用官方j(luò)son庫時(shí),可以使用dumps函數(shù)將Python對象轉(zhuǎn)換為JSON文本,也可以使用loads函數(shù)將JSON文本轉(zhuǎn)換為Python對象。如果需要自定義解碼函數(shù),可以使用object_hook參數(shù)來實(shí)現(xiàn)。

除了官方的json庫,還有一些第三方的庫可供選擇。例如,demjson庫提供了JSON數(shù)據(jù)的編碼和解碼功能,并支持hook函數(shù)。另外,orjson庫是一個(gè)高效的JSON庫,支持多種數(shù)據(jù)類型的序列化,并提供了定制化輸出的選項(xiàng)。

總之,掌握Python的JSON處理庫對于處理JSON數(shù)據(jù)非常重要,可以幫助我們在項(xiàng)目開發(fā)中更加高效地處理JSON數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-817685.html

到了這里,關(guān)于Java開發(fā)者的Python進(jìn)修指南:JSON利器之官方j(luò)son庫、demjson和orjson的實(shí)用指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • ????Java開發(fā)者的Python快速進(jìn)修指南:面向?qū)ο蠡A(chǔ)

    當(dāng)我深入學(xué)習(xí)了面向?qū)ο缶幊讨?,我首先感受到的是代碼編寫的自由度大幅提升。不同于Java中嚴(yán)格的結(jié)構(gòu)和約束,Python在面向?qū)ο蟮膶?shí)現(xiàn)中展現(xiàn)出更加靈活和自由的特性。它使用了一些獨(dú)特的,如self和cls,這些不僅增強(qiáng)了代碼的可讀性,還提供了對類和實(shí)例的明確

    2024年02月05日
    瀏覽(34)
  • ????Java開發(fā)者的Python快速進(jìn)修指南:面向?qū)ο筮M(jìn)階

    在上一期中,我們對Python中的對象聲明進(jìn)行了初步介紹。這一期,我們將深入探討對象繼承、組合以及多態(tài)這三個(gè)核心概念。不過,這里不打算贅述太多理論,因?yàn)槲覀兌贾?,Python與Java在這些方面的主要區(qū)別主要體現(xiàn)在語法上。例如,Python支持多重繼承,這意味著一個(gè)類可

    2024年02月05日
    瀏覽(28)
  • ????Java開發(fā)者的Python快速進(jìn)修指南:面向?qū)ο?-高級篇

    ????Java開發(fā)者的Python快速進(jìn)修指南:面向?qū)ο?-高級篇

    首先,讓我來介紹一下今天的主題。今天我們將討論封裝、反射以及單例模式。除此之外,我們不再深入其他內(nèi)容。關(guān)于封裝功能,Python與Java大致相同,但寫法略有不同,因?yàn)镻ython沒有修飾符。而對于反射來說,我認(rèn)為它比Java簡單得多,不需要頻繁地獲取方法和屬性,而是

    2024年02月05日
    瀏覽(26)
  • Java開發(fā)者的Python快速進(jìn)修指南:面向?qū)ο?-高級篇

    Java開發(fā)者的Python快速進(jìn)修指南:面向?qū)ο?-高級篇

    首先,讓我來介紹一下今天的主題。今天我們將討論封裝、反射以及單例模式。除此之外,我們不再深入其他內(nèi)容。關(guān)于封裝功能,Python與Java大致相同,但寫法略有不同,因?yàn)镻ython沒有修飾符。而對于反射來說,我認(rèn)為它比Java簡單得多,不需要頻繁地獲取方法和屬性,而是

    2024年02月05日
    瀏覽(22)
  • Java開發(fā)者的Python快速進(jìn)修指南:掌握T檢驗(yàn)

    T檢驗(yàn)是一種用于比較兩個(gè)獨(dú)立樣本均值差異的統(tǒng)計(jì)方法。它通過計(jì)算T值和P值來判斷樣本之間是否存在顯著性差異。通常情況下,我們會有兩組數(shù)據(jù),例如一組實(shí)驗(yàn)組和一組對照組。 T檢驗(yàn)的原假設(shè)是兩組樣本的均值相等,備假設(shè)是兩組樣本的均值不相等。T檢驗(yàn)會計(jì)算一個(gè)

    2024年03月09日
    瀏覽(47)
  • ????Java開發(fā)者的Python快速進(jìn)修指南:實(shí)戰(zhàn)之簡易跳表

    ????Java開發(fā)者的Python快速進(jìn)修指南:實(shí)戰(zhàn)之簡易跳表

    之前我已經(jīng)將Python的基本語法與Java進(jìn)行了比較,相信大家對Python也有了一定的了解。我不會選擇去寫一些無用的業(yè)務(wù)邏輯來加強(qiáng)對Python的理解。相反,我更喜歡通過編寫一些數(shù)據(jù)結(jié)構(gòu)和算法來加深自己對Python編程的理解。學(xué)習(xí)任何語言都一樣。 通過編寫數(shù)據(jù)結(jié)構(gòu)和算法,不

    2024年02月05日
    瀏覽(29)
  • ????Java開發(fā)者的Python快速進(jìn)修指南:自定義模塊及常用模塊

    ????Java開發(fā)者的Python快速進(jìn)修指南:自定義模塊及常用模塊

    好的,按照我們平常的慣例,我先來講一下今天這節(jié)課的內(nèi)容,以及Java和Python在某些方面的相似之處。Python使用import語句來導(dǎo)入包,而Java也是如此。然而,兩者之間的區(qū)別在于Python沒有類路徑的概念,它直接使用.py文件的文件名作為導(dǎo)入路徑,并將其余的工作交給Python解釋

    2024年02月05日
    瀏覽(37)
  • ????Java開發(fā)者的Python快速進(jìn)修指南:網(wǎng)絡(luò)編程及并發(fā)編程

    ????Java開發(fā)者的Python快速進(jìn)修指南:網(wǎng)絡(luò)編程及并發(fā)編程

    今天我們將對網(wǎng)絡(luò)編程和多線程技術(shù)進(jìn)行講解,這兩者的原理大家都已經(jīng)了解了,因此我們主要關(guān)注的是它們的寫法區(qū)別。雖然這些區(qū)別并不是非常明顯,但我們之所以將網(wǎng)絡(luò)編程和多線程一起講解,是因?yàn)樵趯W(xué)習(xí)Java的socket知識時(shí),我們通常會將它們結(jié)合使用,以實(shí)現(xiàn)服務(wù)器

    2024年02月05日
    瀏覽(25)
  • Java開發(fā)者的Python快速進(jìn)修指南:實(shí)戰(zhàn)之跳表pro版本

    Java開發(fā)者的Python快速進(jìn)修指南:實(shí)戰(zhàn)之跳表pro版本

    之前我們講解了簡易版的跳表,我希望你能親自動手實(shí)現(xiàn)一個(gè)更完善的跳表,同時(shí)也可以嘗試實(shí)現(xiàn)其他數(shù)據(jù)結(jié)構(gòu),例如動態(tài)數(shù)組或哈希表等。通過實(shí)踐,我們能夠發(fā)現(xiàn)自己在哪些方面還有所欠缺。這些方法只有在熟練掌握之后才會真正理解,就像我在編寫代碼的過程中,難免

    2024年02月05日
    瀏覽(26)
  • ????Java開發(fā)者的Python快速進(jìn)修指南:實(shí)戰(zhàn)之跳表pro版本

    ????Java開發(fā)者的Python快速進(jìn)修指南:實(shí)戰(zhàn)之跳表pro版本

    之前我們講解了簡易版的跳表,我希望你能親自動手實(shí)現(xiàn)一個(gè)更完善的跳表,同時(shí)也可以嘗試實(shí)現(xiàn)其他數(shù)據(jù)結(jié)構(gòu),例如動態(tài)數(shù)組或哈希表等。通過實(shí)踐,我們能夠發(fā)現(xiàn)自己在哪些方面還有所欠缺。這些方法只有在熟練掌握之后才會真正理解,就像我在編寫代碼的過程中,難免

    2024年02月05日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包