最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中protobuf和json互相轉(zhuǎn)換應(yīng)用處理方法

 更新時間:2022年12月01日 16:57:01   作者:hsy12342611  
protobuf目前有proto2和proto3兩個版本,本文所介紹的是基于proto3,在Python 3.6.9環(huán)境下運行,本文記錄一下python中protobuf和json的相互轉(zhuǎn)換的處理方法,感興趣的朋友跟隨小編一起看看吧

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

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

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

1.ProtoBuf中定義字段與各語言類型對應(yīng)表

 2.ProtoBuf使用方法

2.1 下載安裝protobuf生成器

protobuf生成器可以通過源碼編譯得到,也可以下載別人編譯好的應(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 

說明:
-I  或者  --proto_path用來指定proto接口定義文件所在路徑

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

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

2.4 調(diào)用

引入protobuf庫和2.3生成的接口,就可以進行自己的業(yè)務(wù)開發(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()
#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()

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

運行結(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對象序列化為字節(jié)流
    pb1 = person.SerializeToString()
    
    person1 = message_pb2.Person()
    #字節(jié)流流構(gòu)造PB對象
    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)

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

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

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

運行結(jié)果如下:

到此這篇關(guān)于python中protobuf和json互相轉(zhuǎn)換應(yīng)用的文章就介紹到這了,更多相關(guān)python protobuf和json互相轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python封裝原理與實現(xiàn)方法詳解

    Python封裝原理與實現(xiàn)方法詳解

    這篇文章主要介紹了Python封裝原理與實現(xiàn)方法,結(jié)合實例形式較為詳細(xì)的分析了Python封裝的概念、原理、實現(xiàn)方法及相關(guān)操作注意事項,需要的朋友可以參考下
    2018-08-08
  • Python切割圖片成九宮格的示例代碼

    Python切割圖片成九宮格的示例代碼

    這篇文章主要介紹了Python切割圖片成九宮格的相關(guān)知識,本文通過截圖實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • 詳解Python中find()方法的使用

    詳解Python中find()方法的使用

    這篇文章主要介紹了詳解Python中find()方法的使用,是Python學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • python進程管理工具supervisor使用實例

    python進程管理工具supervisor使用實例

    這篇文章主要介紹了python進程管理工具supervisor使用實例,本文介紹了supervisor的安裝、配置、使用等內(nèi)容,需要的朋友可以參考下
    2014-09-09
  • Django完整增刪改查系統(tǒng)實例代碼

    Django完整增刪改查系統(tǒng)實例代碼

    Django實現(xiàn)增刪改查,主要是依賴于models來實現(xiàn)的,下面這篇文章主要給大家介紹了關(guān)于Django完整增刪改查系統(tǒng)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 用Python實現(xiàn)數(shù)據(jù)的透視表的方法

    用Python實現(xiàn)數(shù)據(jù)的透視表的方法

    今天小編就為大家分享一篇用Python實現(xiàn)數(shù)據(jù)的透視表的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Pycharm激活方法及詳細(xì)教程(詳細(xì)且實用)

    Pycharm激活方法及詳細(xì)教程(詳細(xì)且實用)

    這篇文章主要介紹了Pycharm激活方法及詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-05-05
  • Python實現(xiàn)PDF轉(zhuǎn)換文本詳解

    Python實現(xiàn)PDF轉(zhuǎn)換文本詳解

    這篇文章主要介紹了詳解用Python把PDF轉(zhuǎn)換為文本方法總結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-10-10
  • Python爬蟲庫BeautifulSoup的介紹與簡單使用實例

    Python爬蟲庫BeautifulSoup的介紹與簡單使用實例

    BeautifulSoup是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫,本文為大家介紹下Python爬蟲庫BeautifulSoup的介紹與簡單使用實例其中包括了,BeautifulSoup解析HTML,BeautifulSoup獲取內(nèi)容,BeautifulSoup節(jié)點操作,BeautifulSoup獲取CSS屬性等實例
    2020-01-01
  • 在Python 2.7即將停止支持時,我們?yōu)槟銕砹艘环輕ython 3.x遷移指南

    在Python 2.7即將停止支持時,我們?yōu)槟銕砹艘环輕ython 3.x遷移指南

    這篇文章主要介紹了在Python 2.7即將停止支持時我們?yōu)槟銣?zhǔn)備了一份python 3.x遷移指南的相關(guān)資料,需要的朋友可以參考下
    2018-01-01

最新評論

新化县| 股票| 榆树市| 建宁县| 寿阳县| 满城县| 张家川| 改则县| 乐昌市| 徐汇区| 册亨县| 永安市| 连州市| 澄城县| 武城县| 宁陕县| 乐平市| 谢通门县| 肥西县| 同心县| 万年县| 台南县| 宣武区| 宁国市| 余江县| 微山县| 略阳县| 保亭| 大宁县| 吉林省| 晋州市| 江城| 沙雅县| 河间市| 五大连池市| 永春县| 桐乡市| 杭锦后旗| 张家口市| 寻甸| 雷波县|