Skip to main content

A flexible Python implementation of the JSON-RPC 2.0 protocol.

Project description

pyjsonrpc2

PyPI PyPI - Python Version GitHub PRs Welcome

A flexible Python implementation of the JSON-RPC 2.0 protocol (currently server-side only).

Key features

  • Full compliance with the JSON-RPC 2.0 specification
  • No transport functionality
  • Multiple method registration patterns (class-based, individual methods, lambda, etc.)
  • Automatic & custom error handling capabilities
  • Support for both string and bytes input
  • Complete type hints (passes mypy --strict)
  • Extensive unit tests (full coverage)
  • Semantic versioning adherence

Installation

To install the package, use pip:

pip install pyjsonrpc2

Usage

For more info, check the /examples directory.

Basic Server Creation

from pyjsonrpc2.server import JsonRpcServer, rpc_method, JsonRpcError

# Create a basic server
server = JsonRpcServer()

Method Registration Patterns

These are the main patterns for registering RPC methods. /examples/registering_methods.py contains a few more.

  1. Class-based approach with decorators:
class MathServer(JsonRpcServer):
    @rpc_method
    def square(self, x):
        return x**2

    @rpc_method(name="cube")
    def calculate_cube(self, x):
        return x**3

server = MathServer()
  1. Adding individual methods using decorators:
@server.add_method
def add(a, b):
    return a + b
  1. Adding methods with custom names:
def sub(a, b):
    return a - b

server.add_method(sub, name="substract")
  1. Adding lambda functions:
server.add_method(lambda a, b: a % b, name="modulo")

Error Handling

Error handling features:

  • Custom error codes for implementation-defined & application-defined errors through the JsonRpcError class
  • Automatic conversion of Python exceptions to JSON-RPC Internal error responses
  • Support for additional error data in a structured format
  • Built-in handling of protocol-level errors (invalid JSON, missing required fields, etc.)
  • Error logging for debugging purposes
  1. Custom Implementation-Defined Errors:
class AdvancedMathServer(JsonRpcServer):
    @rpc_method
    def divide(self, a, b):
        if b == 0:
            raise JsonRpcError(
                code=-32000,
                message="Division by zero",
                data={"numerator": a, "denominator": b}
            )
        return a / b
  1. Multiple Error Conditions:
@rpc_method
def factorial(self, n):
    if not isinstance(n, int):
        # Regular exceptions are caught and converted to Internal error responses
        raise TypeError("n must be an integer")

    if n < 0:
        # Custom JSON-RPC errors with additional data
        raise JsonRpcError(
            code=-32001,
            message="Invalid input for factorial",
            data={"input": n, "reason": "Must be non-negative"}
        )
    # ... implementation ...

Request execution

result = server.call('{"jsonrpc": "2.0", "method": "add", "params": [5, 3], "id": 1}')
result = server.call(b'{"jsonrpc": "2.0", "method": "subtract", "params": [5, 3], "id": 2}')

Tests

The simplest way to run tests is:

python -m unittest

As a more robust alternative, you can install tox to automatically test across the supported python versions, then run:

tox -p

Issue tracker

Please report any bugs or enhancement ideas using the issue tracker.

License

pyjsonrpc2 is licensed under the terms of the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyjsonrpc2-1.0.1.tar.gz (14.6 kB view details)

Uploaded Source

Built Distribution

pyjsonrpc2-1.0.1-py3-none-any.whl (7.6 kB view details)

Uploaded Python 3

File details

Details for the file pyjsonrpc2-1.0.1.tar.gz.

File metadata

  • Download URL: pyjsonrpc2-1.0.1.tar.gz
  • Upload date:
  • Size: 14.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.1

File hashes

Hashes for pyjsonrpc2-1.0.1.tar.gz
Algorithm Hash digest
SHA256 ecc90eb901efde01d250c7c43fcd88af0f2571e8e45df39562603727b781ce93
MD5 ddda48a6ebc5f203f7e954bbb0acf413
BLAKE2b-256 f99e8c63d9ab8a4b87121ef66bf55a1bbb2a330f454d5fb8c6daafa6bed23a6a

See more details on using hashes here.

File details

Details for the file pyjsonrpc2-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for pyjsonrpc2-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 bf11538fd99febd38be3b3992630dd04a06bf70d7dd73c5f274099db8ddd51ff
MD5 a5cd6cd27f7410184d1476e3097242ed
BLAKE2b-256 6b4213fdd81a190d082c070c3517422658e8f6b3edc7e9a93ba82b0e2c5cbf1a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page