JSON-RPCって何?まずは基本から理解しよう
JSON-RPCは「JSON Remote Procedure Call」の略で、離れた場所にあるコンピュータの機能を呼び出すための通信プロトコルです。
「プロシージャコール」と聞くと難しく感じるかもしれませんが、簡単に言うと「別のコンピュータにある関数(機能)を、まるで自分のコンピュータにあるかのように呼び出せる仕組み」なんです。
例えば、あなたが電卓アプリで「42から23を引く」という計算をしたいとします。通常なら、自分のコンピュータで計算しますよね。
でも、もし計算が複雑で、専用のサーバーに計算させたい場合、JSON-RPCを使えば「subtract(引き算)という機能を使って、42と23を処理してね」とサーバーに指示できるわけです。
なぜJSONを使うの?

JSON-RPCの「JSON」の部分は、JavaScript Object Notation(JavaScriptオブジェクト記法)のことです。
JSONは、データをやり取りするための軽量で読みやすい形式なんです。
JSONの特徴
- 人間にも読みやすい形式
- コンピュータが処理しやすい
- 多くのプログラミング言語で対応している
- データサイズが小さく、通信が速い
例えば、こんな感じでデータを表現します。
{
"name": "田中太郎",
"age": 25,
"city": "東京"
}
見ての通り、とてもシンプルで分かりやすいですよね。
JSON-RPCの基本的な仕組み
JSON-RPCの通信は、主に「リクエスト(要求)」と「レスポンス(応答)」という2つのメッセージでやり取りされます。
リクエスト(要求)の構造
クライアント(依頼する側)がサーバー(処理する側)に送るメッセージには、以下の情報が含まれています。
- jsonrpc:使用しているプロトコルのバージョン(通常は”2.0″)
- method:実行したい機能(メソッド)の名前
- params:機能に渡すパラメータ(引数)
- id:リクエストを識別するための番号や文字列
レスポンス(応答)の構造
サーバーが処理を終えてクライアントに返すメッセージには、以下の情報が含まれます。
- jsonrpc:使用しているプロトコルのバージョン
- result:処理が成功した場合の結果
- error:エラーが発生した場合のエラー情報
- id:リクエストと同じID
実際のJSON-RPCのやり取りを見てみよう
言葉だけではピンと来ないかもしれないので、実際の例を見てみましょう。
例:引き算の計算を依頼する場合
クライアントからサーバーへのリクエスト:
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": 1
}
これは「subtract(引き算)という機能を使って、42から23を引いてください」という意味です。
サーバーからクライアントへのレスポンス:
{
"jsonrpc": "2.0",
"result": 19,
"id": 1
}
これは「計算の結果は19です」という意味ですね。
IDが同じなので、クライアントは「これは自分が送ったリクエストに対する答えだ」と分かります。
パラメータの指定方法
JSON-RPCでは、パラメータを2つの方法で指定できます。
配列形式(位置指定)
順番で引数を指定する方法です。
{
"jsonrpc": "2.0",
"method": "subtract",
"params": [42, 23],
"id": 1
}
この場合、最初の数値が「引かれる数」、2番目の数値が「引く数」になります。
オブジェクト形式(名前指定)
名前を付けて引数を指定する方法です。
{
"jsonrpc": "2.0",
"method": "subtract",
"params": {"minuend": 42, "subtrahend": 23},
"id": 3
}
こちらの方が、どのパラメータが何を意味するのか分かりやすいですね。
通知(Notification)という機能
JSON-RPCには「通知」という特別な機能があります。
通常のリクエストは、サーバーからの応答を待ちますが、通知は応答が不要な一方通行のメッセージです。
通知には「id」が含まれません。
{
"jsonrpc": "2.0",
"method": "update",
"params": [1, 2, 3, 4, 5]
}
例えば、ログを送信する場合や、定期的にデータを送るだけで結果を待つ必要がない場合に使われます。
バッチリクエスト機能
JSON-RPCでは、複数のリクエストをまとめて一度に送ることができます。
これを「バッチリクエスト」と呼びます。
[
{"jsonrpc": "2.0", "method": "sum", "params": [1, 2, 4], "id": "1"},
{"jsonrpc": "2.0", "method": "subtract", "params": [42, 23], "id": "2"},
{"jsonrpc": "2.0", "method": "multiply", "params": [5, 6], "id": "3"}
]
サーバーは、それぞれのリクエストに対して個別に処理を行い、結果をまとめて返します。
ただし、レスポンスの順番は保証されていません。そのため、IDを使ってリクエストとレスポンスを対応させる必要があります。
エラー処理の仕組み
処理中にエラーが発生した場合、サーバーはエラー情報を返します。
{
"jsonrpc": "2.0",
"error": {
"code": -32601,
"message": "Method not found"
},
"id": 1
}
エラーオブジェクトには以下の情報が含まれます。
- code:エラーコード(数値)
- message:エラーメッセージ(文字列)
- data:追加のエラー情報(オプション)
主なエラーコード
- -32700:JSON解析エラー(パースエラー)
- -32600:無効なリクエスト
- -32601:メソッドが見つからない
- -32602:無効なパラメータ
- -32603:内部エラー
JSON-RPCのバージョン
JSON-RPCには主に2つのバージョンがあります。
JSON-RPC 1.0(2005年)
初期バージョンで、基本的な機能を提供していましたが、いくつか問題点がありました。
- 名前付きパラメータが使えない
- エラー情報が不十分
- ピアツーピア通信が前提
JSON-RPC 2.0(現在の標準)
改良版で、2007年に仕様が確定しました。現在はこちらが広く使われています。
- 名前付きパラメータに対応
- 詳細なエラー情報
- クライアント・サーバー型に対応
- バッチリクエストのサポート
- 通知機能の改善
JSON-RPCの主な特徴とメリット
シンプルで軽量
仕様が非常にシンプルなので、理解しやすく実装も簡単です。
データ量も少ないため、通信が高速になります。
トランスポート非依存
JSON-RPCは、通信方法(トランスポート層)に依存しません。
以下のような様々な方法で使えます。
- HTTP/HTTPS
- WebSocket
- TCP/IPソケット
- SSH
- ファイル入出力
言語非依存
JSONは多くのプログラミング言語でサポートされているため、どんな言語でも使えます。
PythonでもJavaでもJavaScriptでも、同じJSON-RPCの仕様で通信できるんです。
非同期処理に対応
複数のリクエストを送った場合、サーバーは順番通りではなく、処理が終わったものから返すことができます。
これにより、効率的な処理が可能になります。
JSON-RPCの実際の活用例
ブロックチェーン技術(Ethereum)
Ethereumなどのブロックチェーンでは、JSON-RPCが標準的な通信プロトコルとして使われています。
ウォレットアプリケーションがブロックチェーンノードと通信する際、JSON-RPCを使って情報を取得したり、トランザクションを送信したりします。
AI エージェント開発
2024年以降、AIエージェント開発でもJSON-RPCが注目されています。
- MCP(Model Context Protocol):AnthropicがLLMアプリケーションと外部データソースを統合するために発表したプロトコルで、JSON-RPCがベースになっています
- A2A Protocol(Agent2Agent Protocol):GoogleがAIエージェント間の通信のために発表したプロトコルで、これもJSON-RPCを基礎にしています
分散システムでのAPI通信
マイクロサービスアーキテクチャなど、複数のサービスが連携するシステムで、サービス間の通信にJSON-RPCが使われることがあります。
RESTful APIとの違い
JSON-RPCとよく比較されるのが、RESTful APIです。
RESTful APIの特徴
- リソース(データ)に焦点を当てる
- HTTPメソッド(GET、POST、PUT、DELETEなど)を使い分ける
- URLが複数のエンドポイントに分かれる
JSON-RPCの特徴
- メソッド(機能)に焦点を当てる
- 通常は1つのエンドポイントで全ての機能を提供
- リクエストの中身(method)で実行する機能を指定
どちらを選ぶべきか
- RESTful API:リソースの操作が中心の場合、一般的なWeb APIに適している
- JSON-RPC:複雑な処理や関数呼び出しが中心の場合、シンプルさと高速性が求められる場合
JSON-RPCを使う際の注意点
セキュリティ対策が必要
JSON-RPC自体には、認証や権限管理の仕組みがありません。
HTTPS通信や独自の認証システムを組み合わせる必要があります。
バージョンの互換性
JSON-RPC 1.0と2.0には互換性がありません。
必ず「jsonrpc」フィールドでバージョンを明記しましょう。
予約されたメソッド名に注意
「rpc.」で始まるメソッド名は、内部用に予約されています。
独自のメソッド名には使わないようにしましょう。
エラーハンドリングは必須
適切なエラー処理を実装しないと、問題の原因を特定するのが難しくなります。
エラーコードとメッセージを適切に設定することが大切です。
簡単なPythonでの実装例
JSON-RPCクライアントの簡単な例を見てみましょう。
import requests
import json
def send_json_rpc_request(url, method, params, request_id):
headers = {'Content-Type': 'application/json'}
payload = {
"jsonrpc": "2.0",
"method": method,
"params": params,
"id": request_id
}
response = requests.post(url, data=json.dumps(payload), headers=headers)
return response.json()
# サーバーのURL
url = "http://example.com/json-rpc"
# リクエストを送信
response = send_json_rpc_request(url, "subtract", [42, 23], 1)
# 結果を表示
print(json.dumps(response, indent=4))
このコードは、指定したサーバーに引き算のリクエストを送り、結果を表示します。
まとめ
JSON-RPCは、離れた場所にあるコンピュータの機能を呼び出すためのシンプルで効率的なプロトコルです。
JSONという読みやすいデータ形式を使うことで、人間にもコンピュータにも理解しやすい通信を実現しています。現在広く使われているのはJSON-RPC 2.0で、エラー処理やバッチリクエストなどの機能が充実しています。
主な特徴として、シンプルさ、軽量性、トランスポート非依存、言語非依存といった点が挙げられます。ブロックチェーン技術やAIエージェント開発など、様々な分野で活用されており、特にEthereumでは標準的な通信プロトコルとして採用されています。
RESTful APIと比較すると、JSON-RPCはメソッド(機能)中心の設計で、1つのエンドポイントで全ての機能を提供できるのが特徴です。複雑な処理や関数呼び出しが中心のシステムでは、JSON-RPCの方が適している場合が多いでしょう。
ただし、セキュリティ対策は別途必要になるため、HTTPS通信や認証システムと組み合わせて使用することが重要です。シンプルだからこそ、適切な設計と実装が求められるプロトコルと言えますね。

コメント