導航:首頁 > 編程語言 > pythonjsonrpc

pythonjsonrpc

發布時間:2023-07-02 13:49:16

❶ 【Python】淺談python中的json

一 前言  

   最近一直在做開發相關的工作--基於Django的web 平台,其中需要從model層傳輸數據到view 層做數據展示或者做業務邏輯處理。我們採用通用的Json格式--Json(JavaScript Object Notation) 是一種輕量級的數據交換格式,易於閱讀和程序解析。

二 認識Json

   2.1 Json 結構

   常見的Json格式為 「名稱/值」對的集合,其中 值可以是對象,列表,字典,字元串等等。比如

backup_data = {"back_to_host": "dbbk0",

"ip_address": "10.10.20.3",

"host_name": "rac4",

"port": 3306}

  2.2 使用Json

  Python的Json模塊序列化與反序列化的過程分別是 編碼和解碼。這兩個過程涉及到兩組不同的函數

  編碼 把一個Python對象編碼轉換成Json字元串,json.mps(data)/json.mp(data,file_handler)

  解碼 把Json格式字元串解碼轉換成Python對象,json.loads(data)/json.load(file_handler)

  在python中要使用Json模塊做相關操作,必須先導入:

import Json

  2.3 主要函數

  編碼函數主要有 json.mps(data)/json.mp(data,file_handler)

   json.mps()的參數是將python對象轉換為字元串,如使用json.mps序列化的對象json_mps=json.mps({'a':1, 'b':2}) ,json_mps='{"b": 2, "a": 1}'

   json.mp 是將內置類型序列化為json對象後寫入文件

 解碼函數主要由json.loads(data)/json.load(file_handler)  

    json.loads的參數是內存對象,把Json格式字元串解碼轉換成Python對象,json_loads=json.loads(d_json)  #{ b": 2, "a": 1},使用load重新反序列化為dict

    json.load()的參數針對文件句柄,比如本地有一個文件/tmp/test.json  json_load=json.load(open('/tmp/test.json'))

具體案例參考如下:

In [3]: data={"back_to_host": "rac1",

...: "ip_address": "10.215.20.3",

...: "host_name": "rac3",

...: "port": 3306}

In [7]: json_str=json.mps(data)

In [8]: print json_str

{"ip_address": "10.215.20.3", "back_to_host": "rac1", "host_name": "rac3", "port": 3306}

In [9]: json_loads=json.load(json_str)

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

<ipython-input-9-180506f16431> in <mole>()

----> 1 json_loads=json.load(json_str)

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc in load(fp, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)

284

285 ""

注意 從上面的報錯信息來看 json.loads 傳參是字元串類型,並不是文件句柄,沒有 read()屬性。

In [10]: json_loads=json.loads(json_str)

In [11]: print json_loads

{u'back_to_host': u'rac1', u'ip_address': u'10.215.20.3', u'host_name': u'rac3', u'port': 3306}

In [12]: type(json_loads)

Out[12]: dict

In [13]: type(json_str)

Out[13]: str

利用mp 將數據寫入 mp.json

In [17]: with open('/tmp/mp.json','w') as f:

...: json.mp(json_str,f)

...:

yangyiDBA:~ yangyi$ cat /tmp/mp.json

"{\"ip_address\": \"10.10.20.3\", \"back_to_host\": \"rac1\", \"host_name\": \"rac3\", \"port\": 3306}"

yangyiDBA:~ yangyi$

利用json.load 將mp.sjon的數據讀出來並賦值給 data 

In [18]: with open('/tmp/mp.json','r') as f:

...: data=json.load(f)

...:

In [19]: print data

{"ip_address": "10.10.20.3", "back_to_host": "rac1", "host_name": "rac3", "port": 3306}

三 小結

  本文算是一篇學習筆記,主要對比了json.loads/json.load  , json.mps/ json.mp 的使用差異 ,方便以後更好的使用json 。

以上為本次分享內容,感謝觀看。

❷ Dubbo——HTTP 協議 + JSON-RPC

Protocol 還有一個實現分支是 AbstractProxyProtocol,如下圖所示:

從圖中我們可以看到:gRPC、HTTP、WebService、Hessian、Thrift 等協議對應的 Protocol 實現,都是繼承自 AbstractProxyProtocol 抽象類。

目前互聯網的技術棧百花齊放,很多公司會使用 Node.js、Python、Rails、Go 等語言來開發 一些 Web 端應用,同時又有很多服務會使用 Java 技術棧實現,這就出現了大量的跨語言調用的需求。Dubbo 作為一個 RPC 框架,自然也希望能實現這種跨語言的調用,目前 Dubbo 中使用「HTTP 協議 + JSON-RPC」的方式來達到這一目的,其中 HTTP 協議和 JSON 都是天然跨語言的標准,在各種語言中都有成熟的類庫。

下面就重點來分析 Dubbo 對 HTTP 協議的支持。首先,會介紹 JSON-RPC 的基礎,並通過一個示例,快速入門,然後介紹 Dubbo 中 HttpProtocol 的具體實現,也就是如何將 HTTP 協議與 JSON-RPC 結合使用,實現跨語言調用的效果。

Dubbo 中支持的 HTTP 協議實際上使用的是 JSON-RPC 協議。

JSON-RPC 是基於 JSON 的跨語言遠程調用協議。Dubbo 中的 bbo-rpc-xml、bbo-rpc-webservice 等模塊支持的 XML-RPC、WebService 等協議與 JSON-RPC 一樣,都是基於文本的協議,只不過 JSON 的格式比 XML、WebService 等格式更加簡潔、緊湊。與 Dubbo 協議、Hessian 協議等二進制協議相比,JSON-RPC 更便於調試和實現,可見 JSON-RPC 協議還是一款非常優秀的遠程調用協議。

在 Java 體系中,有很多成熟的 JSON-RPC 框架,例如 jsonrpc4j、jpoxy 等,其中,jsonrpc4j 本身體積小巧,使用方便,既可以獨立使用,也可以與 Spring 無縫集合,非常適合基於 Spring 的項目。

下面先來看看 JSON-RPC 協議中請求的基本格式:

JSON-RPC請求中各個欄位的含義如下:

在 JSON-RPC 的服務端收到調用請求之後,會查找到相應的方法並進行調用,然後將方法的返回值整理成如下格式,返回給客戶端:

JSON-RPC響應中各個欄位的含義如下:

Dubbo 使用 jsonrpc4j 庫來實現 JSON-RPC 協議,下面使用 jsonrpc4j 編寫一個簡單的 JSON-RPC 服務端示常式序和客戶端示常式序,並通過這兩個示常式序說明 jsonrpc4j 最基本的使用方式。

首先,需要創建服務端和客戶端都需要的 domain 類以及服務介面。先來創建一個 User 類,作為最基礎的數據對象:

接下來創建一個 UserService 介面作為服務介面,其中定義了 5 個方法,分別用來創建 User、查詢 User 以及相關信息、刪除 User:

UserServiceImpl 是 UserService 介面的實現類,其中使用一個 ArrayList 集合管理 User 對象,具體實現如下:

整個用戶管理業務的核心大致如此。下面我們來看服務端如何將 UserService 與 JSON-RPC 關聯起來。

首先,創建 RpcServlet 類,它是 HttpServlet 的子類,並覆蓋了 HttpServlet 的 service() 方法。我們知道,HttpServlet 在收到 GET 和 POST 請求的時候,最終會調用其 service() 方法進行處理;HttpServlet 還會將 HTTP 請求和響應封裝成 HttpServletRequest 和 HttpServletResponse 傳入 service() 方法之中。這里的 RpcServlet 實現之中會創建一個 JsonRpcServer,並在 service() 方法中將 HTTP 請求委託給 JsonRpcServer 進行處理:

最後,創建一個 JsonRpcServer 作為服務端的入口類,在其 main() 方法中會啟動 Jetty 作為 Web 容器,具體實現如下:

這里使用到的 web.xml 配置文件如下:

完成服務端的編寫之後,下面再繼續編寫 JSON-RPC 的客戶端。在 JsonRpcClient 中會創建 JsonRpcHttpClient,並通過 JsonRpcHttpClient 請求服務端:

在 AbstractProxyProtocol 的 export() 方法中,首先會根據 URL 檢查 exporterMap 緩存,如果查詢失敗,則會調用 ProxyFactory.getProxy() 方法將 Invoker 封裝成業務介面的代理類,然後通過子類實現的 doExport() 方法啟動底層的 ProxyProtocolServer,並初始化 serverMap 集合。具體實現如下:

在 HttpProtocol 的 doExport() 方法中,與前面介紹的 DubboProtocol 的實現類似,也要啟動一個 RemotingServer。為了適配各種 HTTP 伺服器,例如,Tomcat、Jetty 等,Dubbo 在 Transporter 層抽象出了一個 HttpServer 的介面。

bbo-remoting-http 模塊的入口是 HttpBinder 介面,它被 @SPI 註解修飾,是一個擴展介面,有三個擴展實現,默認使用的是 JettyHttpBinder 實現,如下圖所示:

HttpBinder 介面中的 bind() 方法被 @Adaptive 註解修飾,會根據 URL 的 server 參數選擇相應的 HttpBinder 擴展實現,不同 HttpBinder 實現返回相應的 HttpServer 實現。HttpServer 的繼承關系如下圖所示:

這里以 JettyHttpServer 為例簡單介紹 HttpServer 的實現,在 JettyHttpServer 中會初始化 Jetty Server,其中會配置 Jetty Server 使用到的線程池以及處理請求 Handler:

可以看到 JettyHttpServer 收到的全部請求將委託給 DispatcherServlet 這個 HttpServlet 實現,而 DispatcherServlet 的 service() 方法會把請求委託給對應接埠的 HttpHandler 處理:

了解了 Dubbo 對 HttpServer 的抽象以及 JettyHttpServer 的核心之後,回到 HttpProtocol 中的 doExport() 方法繼續分析。

在 HttpProtocol.doExport() 方法中會通過 HttpBinder 創建前面介紹的 HttpServer 對象,並記錄到 serverMap 中用來接收 HTTP 請求。這里初始化 HttpServer 以及處理請求用到的 HttpHandler 是 HttpProtocol 中的內部類,在其他使用 HTTP 協議作為基礎的 RPC 協議實現中也有類似的 HttpHandler 實現類,如下圖所示:

在 HttpProtocol.InternalHandler 中的 handle() 實現中,會將請求委託給 skeletonMap 集合中記錄的 JsonRpcServer 對象進行處理:

skeletonMap 集合中的 JsonRpcServer 是與 HttpServer 對象一同在 doExport() 方法中初始化的。最後,我們來看 HttpProtocol.doExport() 方法的實現:

介紹完 HttpProtocol 暴露服務的相關實現之後,下面再來看 HttpProtocol 中引用服務相關的方法實現,即 protocolBindinRefer() 方法實現。該方法首先通過 doRefer() 方法創建業務介面的代理,這里會使用到 jsonrpc4j 庫中的 JsonProxyFactoryBean 與 Spring 進行集成,在其 afterPropertiesSet() 方法中會創建 JsonRpcHttpClient 對象:

下面來看 doRefer() 方法的具體實現:

在 AbstractProxyProtocol.protocolBindingRefer() 方法中,會通過 ProxyFactory.getInvoker() 方法將 doRefer() 方法返回的代理對象轉換成 Invoker 對象,並記錄到 Invokers 集合中,具體實現如下:

本文重點介紹了在 Dubbo 中如何通過「HTTP 協議 + JSON-RPC」的方案實現跨語言調用。首先介紹了 JSON-RPC 中請求和響應的基本格式,以及其實現庫 jsonrpc4j 的基本使用;接下來我們還詳細介紹了 Dubbo 中 AbstractProxyProtocol、HttpProtocol 等核心類,剖析了 Dubbo 中「HTTP 協議 + JSON-RPC」方案的落地實現。

❸ 技術基礎--JSON-RPC2.0

最近剛加入區塊鏈學習的熱潮,從一些基本技術開始學起。本文翻譯自 JSON-RPC 2.0 Specification . 其實協議很簡單,本不需要翻譯,主要是為了記錄這個學習過程,以及加深理解。

JSON是一種輕量級的數據交換格式。它可以地標數字,字元串,有序數組,以及鍵值對。
而JSON-RPC是一種無狀態的,輕量級的遠程程序調用協議。不只一種數據結構及其處理規則可以符合這種定義。數據通過socket, http, 或其他環境傳輸,並不能確定其將在本進程內使用。它使用JSON來座位數據格式。
設計也很簡單。

關鍵詞「MUST」, "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", "OPTIONAL"的解釋可以在RFC2119中找到。
由於採用了JSON協議,其可傳輸的數據類型也和JSON相同。JSON可以表示四種基本類型, Strings, Numbers, Booleans, Null,還有兩種結構類型:Objects, Arrays。當我們提到「基本類型」的時候,是指四種基本的JSON類型,而「結構類型」則指代以上兩種JSON結構類型。當提到JSON類型時,總會把第一個字母大寫,比如Object, Array, String, Number, Boolean, Null. True和False也是如此。

JSON-RPC 2.0定義的請求對象和響應對象和現有的JSON-RPC 1.0客戶端/伺服器有兼容問題。這兩個版本其實很好區分,2.0定義了一個叫"jsonrpc"的成員,其值時2.0,而1.0版本沒有。2.0的實現往往要兼容1.0的對象,即使我們在開發點對點以外或者明顯不是1.0的業務的時候亦是如此。

RPC調用是指發送一個請求對象到遠程伺服器上。請求對象包括以下成員:
jsonrpc: 用來聲明JSON-RPC協議的版本,固定為「2.0」
method:需要調用的方法。方法名以單詞rpc開頭,後面跟上期限字元,這個欄位在rpc交互的方法及其擴展上被存儲起來,並且不能用於其他意義。
params: 結構化的值,用於存儲方法響應需要用到的參數,且不能被省略。
id:客戶端分配的一個標識符,可以包含字元串,數字或者為空。如果沒有id,就會被當成是廣播通知。這個值一般不能為Null,且為數字時不能有小數。如果請求中含有這個欄位,伺服器在響應時,必須原樣返回該欄位,用來關聯以下兩個對象的不同環境:

當請求參數中不發送id成員時,該請求會被當作通知處理。對於通知,客戶端不關心響應對象,因為服務端也沒必要返回響應對象,確切的說,服務端不準答復一個通知請求,即便這個請求是批處理請求中的一個。
根據這個定義,通知請求並不會被確認,因為客戶端不會收到響應對象,更進一步說,通知請求的客戶端無法感知到錯誤,比如參數錯誤/網路錯誤等。

RPC調用的參數必須是結構化的值(對象或者數組),對象通過名字遍歷,而數組通過位置可遍歷。
數組參數的遍歷順序必須與服務端順序一致。
對象參數的成員值必須與服務端期望的一致,且在大小寫上精確匹配。一旦有成員缺失,會導致錯誤產生。

當RPC請求出錯時,伺服器響應的Response對象中,必須包含error,且包含以下成員:
code: Number類型,表示出錯類型
message: String類型 簡介的一句話來描述錯誤
data: 可以是基本類型,也可以是結構類型,來表示錯誤的額外信息,且可以預設。具體取值由伺服器自定義,比如錯誤詳情,訪問限制等等。
-32768到-32000之間的錯誤碼是系統保留錯誤碼,協議預定義方便未來使用。錯誤碼的定義和XML-RPC類似:
-32700: 解析錯誤,無效的JSON結構,伺服器在解析JSON時出錯
-32600: 請求無效,Request對象不是一個合法的JSON請求
-32601: 未知的方法,伺服器未定義該method,或者該方法不可用
-32602: 參數錯誤
-32603: 網路錯誤
-32000--32099: 伺服器錯誤,伺服器其他錯誤的保留錯誤碼
上述區間以外的錯誤碼可在應用開發時使用。

同時發送多個Request對象時, 客戶端可以把請求都放到一個數組里一起發送。
服務端收到Request對象數組並處理完成後,應當以數組的形式返回,且數組中包含了響應的請求的Response對象。每一個請求對應一個響應,如果請求是通知的話,則不包含該Response對象。服務端在批處理請求任務時,可以按任何順序或者並行化處理。
服務端對請求進行批處理時者不是至少長度為1的合法請求對象數組時,伺服器響應的對象必須是一個單的Response對象。如果沒有Response數組中不包含Response對象,那也不能返回空數組,而應該什麼都不返回。

--> {"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": 1}
<-- {"jsonrpc": "2.0", "result": 19, "id": 1}

--> {"jsonrpc": "2.0", "method": "subtract", "params": [23, 42], "id": 2}<-- {"jsonrpc": "2.0", "result": -19, "id": 2}

--> {"jsonrpc": "2.0", "method": "subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}<-- {"jsonrpc": "2.0", "result": 19, "id": 3}--> {"jsonrpc": "2.0", "method": "subtract", "params": {"minuend": 42, "subtrahend": 23}, "id": 4}<-- {"jsonrpc": "2.0", "result": 19, "id": 4}

--> {"jsonrpc": "2.0", "method": "update", "params": [1,2,3,4,5]}
--> {"jsonrpc": "2.0", "method": "foobar"}

--> {"jsonrpc": "2.0", "method": "foobar", "id": "1"}
<-- {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1"}

--> {"jsonrpc": "2.0", "method": "foobar, "params": "bar", "baz]
<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}

--> {"jsonrpc": "2.0", "method": 1, "params": "bar"}
<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}

--> [ {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"}, {"jsonrpc": "2.0", "method"]<-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}

--> []<-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}

--> [1]
<-- [ {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}]

--> [1,2,3]
<-- [ {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}, {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}, {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}]

--> [
{"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},
{"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},
{"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},
{"foo": "boo"},
{"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},
{"jsonrpc": "2.0", "method": "get_data", "id": "9"}
]
<-- [
{"jsonrpc": "2.0", "result": 7, "id": "1"},
{"jsonrpc": "2.0", "result": 19, "id": "2"},
{"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},
{"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},
{"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}
]

--> [
{"jsonrpc": "2.0", "method": "notify_sum", "params": [1,2,4]},
{"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}
]
<-- //Nothing is returned for all notification batches

使用rpc開頭的方法名是系統擴展方法,且不能用於其他場合。每一個系統擴展都在相關聲明中定義。系統擴展是可選的。

1)如何撰寫一個規范,或者說一個規范由哪些部分組成,本規范是一個很好的模版
2)如何做前後兼容。jsonrpc的兼容方式很簡單,在請求頭部擴展一個jsonrpc的版本號即可。如果是良好的設計,在1.0的時候就應該加上此欄位。
3)嚴謹性。比如,我們不能簡單的使用Null作為id參數來表示通知,服務端解析id失敗也返回Null的id,無法區分這兩種情形。
4)批處理。一個好的設計必然要考慮多任務的批處理,在設計批處理時,需要考慮數據的解析,伺服器可能不按序處理,以及可能並發處理,需要考慮不同的請求在不同的時許下處理可能產生的影響
5)舉例。和測試用例的設計有點類似,盡可能覆蓋全面

JSON-RPC 2.0 Specification

❹ python後端開發需要學什麼

可以參考下面的路徑去學習,祝你學有所成,公司最近在人工智慧和自然語言處理的項目後端項目,我也是網上找了很多知識,最後給自己列了一個學習的目錄,按照這個在復習並在總結,希望能幫到你:

❺ Python爬蟲(七)數據處理方法之JSON

JSON 指的是 JavaScript 對象表示法(JavaScript Object Notation),是輕量級的文本數據交換格式,且具有自我描述性,更易理解。
JSON看起來像python類型(列表,字典)的字元串。

在之前的文章中,我們說到了怎麼用response的方法,獲取到網頁正確解碼後的字元串。如果還有不懂的,可以先閱讀 Python爬蟲(三)Requests庫 。接下來以有道翻譯為例子,說說怎麼通過網頁解碼後的字元串,提取到翻譯結果。

再結合上述有道翻譯的例子,得到字典類型的返回結果,並提取出來翻譯結果。

將上述例子的dict_json換成str字元串,再寫入文本中。

執行完上述的程序,會得到一個fanyi.txt的文件,其結果如下:{"type": "ZH_CN2EN", "errorCode": 0, "elapsedTime": 1, "translateResult": [[{"src": "\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528python", "tgt": "Life is too short, I use python"}]]}。這樣子的一份文檔,中文部分顯示的是二進制,且格式非常不利於閱讀,這並不是我們想要的結果。好在json.mps()為我們提供的兩個方法,以幫助我們更好閱讀文檔。
1.ensure_ascii,能夠讓中文顯示成中文;
2.indent,能夠讓下一行在第一行的基礎上空格。
其用法如下:

閱讀全文

與pythonjsonrpc相關的資料

熱點內容
逍遙安卓微信驗證 瀏覽:579
5g網路什麼時候普及河北邢台 瀏覽:709
編程和運營哪個更適合創業 瀏覽:893
尤里x怎麼升級 瀏覽:399
做業務績效考核需要哪些數據 瀏覽:433
dnf85版本劍魔刷圖加點 瀏覽:407
手機硬碟測試架可以讀取哪些數據 瀏覽:704
ug前後處理結算結果找不到文件 瀏覽:769
網頁框架拆分代碼 瀏覽:382
未來十年網路安全有什麼影響 瀏覽:362
win10更新後進不了劍靈 瀏覽:243
iphone471激活出錯 瀏覽:648
怎麼把文件拷到u盤 瀏覽:620
中伊簽署文件視頻 瀏覽:661
電信光寬頻網路不穩定 瀏覽:504
網路崗軟路由 瀏覽:995
黑莓z10在哪裡下載app 瀏覽:310
net批量下載文件 瀏覽:696
怎麼把蘋果一體機文件拷貝 瀏覽:117
sql文件怎麼寫 瀏覽:9

友情鏈接