Skip to main content

PyPI pyversions PyPI version shields.io PyPI license Downloads

JSON Handler Registry


Standardized way of registering custom JSON serializers/deserializers.

Package json lacks standard approach to registering custom JSON handlers.

Project json-handler-registry has been created to solve that issue.

Usage:

Registering your own handlers:

from typing import Optional
from json_handler_registry.registry import JsonHandlerRegistry
from json_handler_registry.encoder import IJsonEncoder, EncodingResult
from json_handler_registry.decoder import IJsonDecoder


# Implement your custom class encoder:
class MyJsonEncoder(IJsonEncoder):
    def encodeObject(self, obj: object) -> Optional[EncodingResult]:
        """Convert object to a JSON serializable data.
        Or return ``None`` instead.
        """
        pass  # TODO: Actual implementation goes here!


# Implement your custom class decoder:
class MyJsonDecoder(IJsonDecoder):
    def decodeDict(self, dct: dict) -> Optional[object]:
        """Convert dictionary to your type instance.
        Or return ``None`` instead.
        """
        pass  # TODO: Actual implementation goes here!

    def decodeStr(self, valueStr: str) -> Optional[object]:
        """Convert string value to your type instance.
        Or return ``None`` instead.
        """
        pass  # TODO: Actual implementation goes here!


# Register your serializer and deserializer:
JsonHandlerRegistry.registerEncoder(MyJsonEncoder())
JsonHandlerRegistry.registerDecoder(MyJsonDecoder())

Serialization & deserialization:

# Using `tunit` package as an example:
import json
from tunit.config import TUnitConfig
from tunit.unit import Seconds

TUnitConfig.registerJsonHandler() # Enables registry and registers handlers.

# JSON serialization:
messageDto = {"delay": Seconds(10)}
messageJson = json.dumps(messageDto)
print(messageJson) # Prints: '{"delay": "10s"}'

# JSON deserialization:
messageJson = '{"delay": "10s"}'
messageDto = json.loads(messageJson)
print(messageDto) # Prints: {'delay': Seconds(10)}

Popular external packages support:

Package maintainers are encouraged to adopt json-handler-registry in their projects. However, for now, support for popular packages will be successively provided here.

Support for dataclasses-json:

from dataclasses import dataclass
from datetime import datetime
from decimal import Decimal
from enum import Enum, auto
from uuid import UUID, uuid4

from dataclasses_json import DataClassJsonMixin
from json_handler_registry.registry import JsonHandlerRegistry


class TestEnum(Enum):
  Option1 = auto()
  Option2 = auto()
  Option3 = auto()


@dataclass
class TestDataClass(DataClassJsonMixin):
  timestamp: datetime
  id: UUID
  option: TestEnum
  value: Decimal


testData = TestDataClass(
  timestamp=datetime.now().astimezone(),
  id=uuid4(),
  option=TestEnum.Option2,
  value=Decimal(7)
)

JsonHandlerRegistry.packageSupportManager.getPackageSupportConfig('dataclasses-json').enable()
assert TestDataClass.from_json(testData.to_json()) == testData
JsonHandlerRegistry.packageSupportManager.getPackageSupportConfig('dataclasses-json').disable()

# Instead of using 'PackageSupportManager' you can also manually register encoder:
from json_handler_registry.registry import JsonHandlerRegistry
from json_handler_registry.support.impl.dataclasses_json import DataClassJsonEncoder
JsonHandlerRegistry.registerEncoder(DataClassJsonEncoder)

Changelog:


  • Version: 1.5.0
    • Package support manager is now accessible from handler registry.
  • Version: 1.4.0
    • Preserving registration order of encoders/decoders.
    • Configurable auto enable/disable registry feature. (Active by default.)
  • Version: 1.3.0
    • Support for dataclasses-json package.
    • Debug methods for listing registered encoders/decoders.
  • Version: 1.2.0
    • Guard to prevent registry from being easily overridden when enabled.
  • Version: 1.1.0
    • Registry accepts both type and instance of encoder/decoder.

License

MIT

Download files

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

Source Distribution

json-handler-registry-1.5.1.tar.gz (6.4 kB view details)

Uploaded Source

File details

Details for the file json-handler-registry-1.5.1.tar.gz.

File metadata

  • Download URL: json-handler-registry-1.5.1.tar.gz
  • Upload date:
  • Size: 6.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.7.16

File hashes

Hashes for json-handler-registry-1.5.1.tar.gz
Algorithm Hash digest
SHA256 3351f2745b70eaecbb53ccf634a50bebf74329b3b8781caa341988476c24d57e
MD5 8820739ce78e7424caf92f33e07faa9a
BLAKE2b-256 32afadb493fc649e9d214e818be2011a495dd328cd634f4c7110a58e95211195

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

1.5.1 This release

1 file

1.5.0

1 file

1.4.0

1 file

1.3.0

1 file

1.2.0

1 file

1.1.0

1 file

1.0.0

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page