JSON-RPC

約定

由於 JSON-RPC 使用 JSON，它具有與其相同的型別系統。JSON 可以表示四個基本類型（String、Numbers、Boolean 和 Null）和兩個結構化類型（Objects 和 Array）。任何時候文件涉及 JSON 資料類型，第一個字母都必須大寫：Object、Array、String、Number、Boolean、Null。包括 True 和 False 也要大寫。
在用戶端與任何被符合到的伺服端之間交換的所有成員名字應是區分大小寫的。 函式、方法、過程都可以認為是可以互換的。用戶端被定義為請求物件的來源及回應物件的處理程式。伺服端被定義為回應物件的起源和請求物件的處理程式。
該規範的一種實現為可以輕而易舉的填補這兩個角色，即使是在同一時間，同一用戶端或其他不相同的用戶端。 該規範不涉及複雜層。

相容性

JSON-RPC 2.0 的請求物件和回應物件可能無法在較舊的 JSON-RPC 1.0 用戶端或伺服端正常執行，然而我們可以很容易在兩個版本間區分出 2.0。因為 2.0 版本中必須夾帶一個命名為 jsonrpc 且值為 2.0 的欄位。而 1.0 版本是沒有此欄位的。大部分的 2.0 實現應該考慮嘗試相容或者處理 1.0 的物件，即使不是對等的也應給其相關提示。

通知

沒有包含 id 成員的請求物件為通知， 作為通知的請求物件表明用戶端對相應的回應物件並不感興趣，本身也沒有回應物件需要返回給用戶端。伺服端必須不回覆一個通知，包含那些批次請求中的。
由於通知沒有返回的回應物件，所以通知不確定是否被定義。同樣，用戶端不會意識到任何錯誤（例如參數預設，內部錯誤）。

批次呼叫

當需要同時傳送多個請求物件時，用戶端可以傳送一個包含所有請求物件的陣列。
當批次呼叫的所有請求物件處理完成時，伺服端則需要返回一個包含相對應的回應物件陣列。每個回應物件都應對應每個請求物件，除非是通知的請求物件。伺服端可以並行的，以任意順序和任意寬度的並列性來處理這些批次呼叫。
這些相應的回應物件可以任意順序的包含在返回的陣列中，而用戶端應該是基於各個回應物件中的 id 成員來符合對應的請求物件。
若批次呼叫的 RPC 操作本身非一個有效 JSON 或一個至少包含一個值的陣列，則伺服端返回的將單單是一個回應物件而非陣列。若批次呼叫沒有需要返回的回應物件，則伺服端不需要返回任何結果且必須不能返回一個空陣列給用戶端。

範例

在以下的例子裡，-->表示資料傳送至伺服器，<--表示資料傳送至用戶端。
帶索引陣列參數的rpc呼叫：

 --> {"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}
帶關聯陣列參數的 RPC 呼叫：

 --> {"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"}
不包含呼叫方法的 RPC 呼叫：

 --> {"jsonrpc": "2.0", "method": "foobar", "id": "1"}
 <-- {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "1"}
包含無效 JSON 的 RPC 呼叫：

 --> {"jsonrpc": "2.0", "method": "foobar", "params": "bar", "baz] <-- {"jsonrpc": "2.0", "error": {"code": -32700, "message": "Parse error"}, "id": null}
包含無效請求物件的 RPC 呼叫：

 --> {"jsonrpc": "2.0", "method": 1, "params": "bar"}
 <-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
包含無效 JSON 的 RPC 批次呼叫：

 --> [
         {"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}
包含空陣列的 RPC 呼叫：

 --> []
 <-- {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
非空且無效的 RPC 批次呼叫：

 --> [1]
 <-- [
     {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null}
     ]
無效的 RPC 批次呼叫：

 --> [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}
     ]
RPC 批次呼叫：

 --> [
     {"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"}
     ]
所有都為通知的 RPC 批次呼叫：

 --> [
     {"jsonrpc": "2.0", "method": "notify_sum", "params": [1,2,4]},
     {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]}
 ]

擴充功能

以 RPC 開頭的方法名預留作為系統擴充功能，且必須不能用於其他地方。每個系統擴充功能都應該有相關規範文件，所有系統擴充功能都應是可選的。