python中protobuf和json互相轉(zhuǎn)換應(yīng)用-創(chuàng)新互聯(lián)

在實(shí)際信息系統(tǒng)開(kāi)發(fā)中,經(jīng)常會(huì)用到各種各樣的協(xié)議,網(wǎng)絡(luò)協(xié)議常用的有http,tcp,udp等,傳輸數(shù)據(jù)格式協(xié)議有json,xml,TLV等。本節(jié)將給大家介紹一種節(jié)省帶寬數(shù)據(jù)協(xié)議,谷歌的ProtoBuf協(xié)議,該協(xié)議由于是開(kāi)源免費(fèi)的,有多種語(yǔ)言的調(diào)用接口,比如常見(jiàn)C,C++,java,Python,C#,PHP ... 所以國(guó)內(nèi)很多公司都在使用。

新豐網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),新豐網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為新豐上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的新豐做網(wǎng)站的公司定做!

本人所在項(xiàng)目引擎使用C++語(yǔ)言開(kāi)發(fā),外部輸入的protobuf字節(jié)流在內(nèi)部都是使用C++來(lái)處理,上次客戶(hù)端想要用他們的數(shù)據(jù)來(lái)演示效果,讓我去客戶(hù)現(xiàn)處理客戶(hù)數(shù)據(jù),然后導(dǎo)入我們引擎進(jìn)行效果展示??蛻?hù)現(xiàn)場(chǎng)數(shù)據(jù)是excel文件,出差時(shí)沒(méi)有相關(guān)的處理工具,本人只好現(xiàn)場(chǎng)開(kāi)發(fā),提取客戶(hù)excel中的數(shù)據(jù),轉(zhuǎn)換成json,再轉(zhuǎn)換成我們引擎能夠識(shí)別的ProtoBuf字節(jié)流。所以在此記錄一下python中protobuf和json的相互轉(zhuǎn)換的處理方法。

protobuf目前有proto2和proto3兩個(gè)版本,本文所介紹的是基于proto3,在Python 3.6.9環(huán)境下運(yùn)行。

目錄

1.ProtoBuf中定義字段與各語(yǔ)言類(lèi)型對(duì)應(yīng)表

2.ProtoBuf使用方法

2.1 下載安裝protobuf生成器

2.2 定義protobuf格式的應(yīng)用協(xié)議

2.3 生成協(xié)議調(diào)用api

2.4 調(diào)用

3. Json轉(zhuǎn)Protobuf

4. Protobuf轉(zhuǎn)Json


1.ProtoBuf中定義字段與各語(yǔ)言類(lèi)型對(duì)應(yīng)表

2.ProtoBuf使用方法 2.1 下載安裝protobuf生成器

protobuf生成器可以通過(guò)源碼編譯得到,也可以下載別人編譯好的應(yīng)用程序

GitHub上下載地址如下

GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format

2.2 定義protobuf格式的應(yīng)用協(xié)議

下面以公司為業(yè)務(wù)構(gòu)造協(xié)議,舉例如下:

message.proto

syntax = "proto3";

message Empty {}

message Address {
    string province = 1;
    string city = 2;
    string county = 3;
    string detail = 4;
}

message Person {
    int32 id = 1;
    string name = 2;
    Sex  sex = 3;
    Address  addr = 4;
    string email = 5;
    string phone = 6;
    
    enum Sex {
        MAIL   = 0;
        FEMAIL = 1;
    }
}

message Company {
    string name = 1;
    repeated Person employee = 2;
}
2.3 生成協(xié)議調(diào)用api

在Python中,生成方式如下:

/home/test/protobuf/bin/protoc -I=/home/test/Python ?--python_out=/home/test/Python ? message.proto

或者

/home/test/protobuf/bin/protoc --proto_path=/home/test/Python ?--python_out=/home/test/Python ? message.proto

附C++生成方式如下:

/home/test/protobuf/bin/protoc -I=/home/test/cpp ?--cpp_out=/home/test/cpp ? message.proto?

或者
/home/test/protobuf/bin/protoc --proto_path=/home/test/cpp ?--cpp_out=/home/test/cpp ? message.proto?

說(shuō)明:
-I? 或者? --proto_path用來(lái)指定proto接口定義文件所在路徑

--python_out表示生成Python調(diào)用的接口

--cpp_out表示生成C++調(diào)用的接口

2.4 調(diào)用

引入protobuf庫(kù)和2.3生成的接口,就可以進(jìn)行自己的業(yè)務(wù)開(kāi)發(fā)了

3. Json轉(zhuǎn)Protobuf

調(diào)用舉例如下:

#coding=utf-8
import message_pb2
from google.protobuf import json_format
import json

#json轉(zhuǎn)PB
def jsonToPB():
    json_addr = {}
    json_addr["province"] = "shanxisheng"
    json_addr["city"] = "shangluoshi"
    json_addr["county"] = "luonanxian"
    json_addr["detail"] = "guchengzhenliyuancunsanzu"

    json_person = {}
    json_person["id"] = 9999
    json_person["name"] = "liudehua"
    json_person["sex"] = 1
    json_person["addr"] = json_addr
    json_person["email"] = "123456789@163.com"
    json_person["phone"] = "859348598948656"
    
    strjson = json.dumps(json_person, indent=4)
    print(strjson)
    json_to_pb = json_format.Parse(strjson, message_pb2.Person())
    print(json_to_pb.SerializeToString())

if __name__ == "__main__":
    print("=============Json to PB==========")
    jsonToPB()

說(shuō)明:如上先使用json.dumps將字典打包成json字符串,然后使用json_format.Parse將json字符串轉(zhuǎn)換為ProtoBuf對(duì)象,然后將ProtoBuf對(duì)象序列化為字節(jié)流打印輸出。

運(yùn)行結(jié)果如下:

4. Protobuf轉(zhuǎn)Json

調(diào)用代碼如下:

#coding=utf-8
import message_pb2
from google.protobuf import json_format
import json

#PB轉(zhuǎn)json字符串
def pbToJson(pb):
    strjson = json_format.MessageToJson(pb)
    print(strjson)

def buildPB():
    person = message_pb2.Person()
    person.id = 110
    person.name = "Boss"
    person.addr.province = "anm"
    person.addr.city = "qiuchongtian"
    person.addr.county = "ABC"
    person.addr.detail = "123"
    person.sex = message_pb2.Person.Sex.MAIL
    person.email = "rulaifo@qq.com"
    person.phone = "75211234567890"
    #PB對(duì)象序列化為字節(jié)流
    pb1 = person.SerializeToString()
    
    person1 = message_pb2.Person()
    #字節(jié)流流構(gòu)造PB對(duì)象
    person1.ParseFromString(pb1)
    
    com = message_pb2.Company()
    com.name = 'USA'
    idlist = [111, 222, 222]
    for id in idlist:
        per = com.employee.add()
        per.id = id 
    print(com)   
    print(person1)
    return person1

if __name__ == "__main__":
    #構(gòu)造PB
    pb = buildPB()
    print("=============PB to Json==========")
    pbToJson(pb)

說(shuō)明:程序中使用message_pb2.Person()初始化得到一個(gè)protobuf對(duì)象person,然后給對(duì)象person各個(gè)屬性賦值,然后將person序列化為pb1,使用message_pb2.Person()構(gòu)造另一個(gè)對(duì)象

person1,person1使用person序列化后的pb1初始化,此時(shí)person1和person具有相同的屬性。

使用message_pb2.Company()構(gòu)造一個(gè)公司對(duì)象com,然后給屬性賦值。最后使用json_format.MessageToJson將protobuf類(lèi)型的person對(duì)象轉(zhuǎn)化為json字符串打印輸出。

運(yùn)行結(jié)果如下:

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁(yè)題目:python中protobuf和json互相轉(zhuǎn)換應(yīng)用-創(chuàng)新互聯(lián)
地址分享:http://bm7419.com/article44/dssshe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣、小程序開(kāi)發(fā)、靜態(tài)網(wǎng)站手機(jī)網(wǎng)站建設(shè)、微信公眾號(hào)、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

微信小程序開(kāi)發(fā)