jsons


Namejsons JSON
Version 1.6.3 PyPI version JSON
download
home_pagehttps://github.com/ramonhagenaars/jsons
SummaryFor serializing Python objects to JSON (dicts) and back
upload_time2022-06-09 19:52:01
maintainer
docs_urlNone
authorRamon Hagenaars
requires_python>=3.5
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage
            [![Python versions](https://img.shields.io/pypi/pyversions/jsons.svg)](https://img.shields.io/pypi/pyversions/jsons.svg)
[![Downloads](https://pepy.tech/badge/jsons)](https://pepy.tech/project/jsons)
[![PyPI version](https://badge.fury.io/py/jsons.svg)](https://badge.fury.io/py/jsons)
[![Code Coverage](https://codecov.io/gh/ramonhagenaars/jsons/branch/master/graph/badge.svg)](https://codecov.io/gh/ramonhagenaars/jsons)
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/ramonhagenaars/jsons/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/ramonhagenaars/jsons/?branch=master)


<p align='center'>
  <a href='https://jsons.readthedocs.io/en/latest/'>
    <img width='150' src='https://github.com/ramonhagenaars/jsons/raw/master/resources/jsons-logo.svg?sanitize=true' />
  </a>
</p>

  - *Turn Python objects into dicts or (json)strings and back*
  - *No changes required to your objects*
  - *Easily customizable and extendable*
  - *Works with dataclasses, attrs and POPOs*

💗 this lib? Leave a ★ and tell your colleagues!

Example of a model to serialize:

```python
>>> @dataclass
... class Person:
...    name: str
...    birthday: datetime
...
>>> p = Person('Guido van Rossum', birthday_guido)
```

Example of using jsons to serialize:

```python
>>> out = jsons.dump(p)
>>> out
{'birthday': '1956-01-31T12:00:00Z', 'name': 'Guido van Rossum'}
```

Example of using jsons to deserialize:

```python
>>> p2 = jsons.load(out, Person)
>>> p2
Person(name='Guido van Rossum', birthday=datetime.datetime(1956, 1, 31, 12, 0, tzinfo=datetime.timezone.utc))
```

# Installation

    pip install jsons

# Usage

```python
import jsons

some_instance = jsons.load(some_dict, SomeClass)  # Deserialization
some_dict = jsons.dump(some_instance)  # Serialization
```

In some cases, you have instances that contain other instances that need (de)serialization, for instance with lists or dicts. You can use the
`typing` classes for this as is demonstrated below.

```python
from typing import List, Tuple
import jsons

# For more complex deserialization with generic types, use the typing module
list_of_tuples = jsons.load(some_dict, List[Tuple[AClass, AnotherClass]])
```

(For more examples, see the
[FAQ](https://jsons.readthedocs.io/en/latest/faq.html))

# Documentation 

  - [Main documentation](https://jsons.readthedocs.io/en/latest/)
  - [API docs](https://jsons.readthedocs.io/en/latest/api.html)
  - [FAQ](https://jsons.readthedocs.io/en/latest/faq.html)

# Meta

## Recent updates

### 1.6.3

- Bugfix: a string was sometimes unintentionally parsed into a datetime.

### 1.6.2

- Bugfix: `fork_inst`s were not propagated in `default_list_deserializer` (thanks to patrickguenther).

### 1.6.1

- Bugfix: Loading dicts with hashed keys could cause an error due to being loaded twice (thanks to georgeharker).
- Bugfix: IntEnums were not serialized with their names when `use_enum_name=True` (thanks to georgeharker).
- Bugfix: Named tuples did not use `typing.get_type_hints` for getting the types, causing trouble in future annotations (thanks to georgeharker).

### 1.6.0

- Feature: Support for Python3.10.
- Feature: Support for `attrs`.

### 1.5.1

- Bugfix: `ZoneInfo` failed to dump if attached to a `datetime`.

### 1.5.0

- Feature: Support for `ZoneInfo` on Python3.9+.
- Change: microseconds are no longer stripped by default (thanks to pietrodn).

### 1.4.2

- Bugfix: get_origin did not work with python3.9+ parameterized collections (e.g. `dict[str, str]`).

### 1.4.1

- Bugfix: Types of attributes that are not in the constructor were not properly looked for. See issue #128.

### 1.4.0

- Feature: DefaultDicts can now be deserialized.
- Feature: Dicts with any (hashable) key can now be dumped and loaded.
- Feature: Suppress specific warnings.
- Bugfix: Loading a verbose-serialized object in a list could sometimes deserialize that object as a parent class.
- Bugfix: Unwanted stringification of NoneValues is now prevented in Optionals and Unions with NoneType.
- Bugfix: Fixed a bug with postponed annotations and dataclasses. See also [Issue34776](https://bugs.python.org/issue34776).
- Bugfix: Types of attributes that are not in the constructor are now looked for in __annotations__.

### 1.3.1

- Bugfix: Fixed bug where classmethods were included in the serialized result.

### 1.3.0

- Feature: Added `warn_on_fail` parameter to `default_list_deserializer` that allows to continue deserialization upon errors.
- Feature: Added `transform` that can transform an object to an object of another type.
- Feature: Added serializer and deserializer for `pathlib.Path` (thanks to alexmirrington).
- Change: When loading a list fails, the error message now points to the failing index.
- Bugfix: Fixed bug when dumping an object with an innerclass. 

### 1.2.0

- Bugfix: Fixed bug with postponed typehints (PEP-563).
- Bugfix: Loading an invalid value targeting an optional did not raise.
- Bugfix: Loading a dict did not properly pass key_transformers.
- Bugfix: Loading a namedtuple did not properly use key_transformers.
- Bugfix: Utilized `__annotations__` in favor `_field_types` because of deprecation as of 3.8.

### 1.1.2

- Feature: Added `__version__` which can be imported from `jsons`
- Bugfix: Dumping a tuple with ellipsis failed in strict mode.

### 1.1.1

  - Feature: Added a serializer for ``Union`` types.
  - Change: Exceptions are more clear upon deserialization failure (thanks to haluzpav).
  - Change: You can no longer announce a class with a custom name.
  - Bugfix: Fixed dumping optional attributes.
  - Bugfix: Dataclasses inheriting from ``JsonSerializable`` always dumped their attributes as if in strict mode. 

### 1.1.0

  - Feature: Added ``strict`` parameter to ``dump`` to indicate that dumping a certain ``cls`` will ignore any extra data.
  - Feature: When using ``dump(obj, cls=x)``, ``x`` can now be any class (previously, only a class with ``__slots__``).
  - Feature: Support for dumping ``Decimal`` (thanks to herdigiorgi).
  - Feature: Primitives are now cast if possible when dumping (e.g. ``dump(5, str)``).
  - Feature: Dumping iterables with generic types (e.g. ``dump(obj, List[str])``) will now dump with respect to that types (if ``strict``)
  - Feature: The ``default_dict`` serializer now optionally accepts types: ``Optional[Dict[str, type]]``.
  - Change: Improved performance when dumping using ``strict=True`` (up to 4 times faster!).
  - Bugfix: ``set_validator`` with multiple types did not work.

### 1.0.0

  - Feature: Added a serializer/deserializer for `time`.
  - Feature: Added a serializer/deserializer for `timezone`.
  - Feature: Added a serializer/deserializer for `timedelta`.
  - Feature: Added a serializer/deserializer for `date`.
  - Bugfix: Dumping verbose did not store the types of dicts (`Dict[K,
    V]`).
  - Bugfix: Loading with `List` (no generic type) failed.
  - Bugfix: Loading with `Dict` (no generic type) failed.
  - Bugfix: Loading with `Tuple` (no generic type) failed.


## Contributors

Special thanks to the following contributors of code, discussions or
suggestions:

[patrickguenther](https://github.com/patrickguenther),
[davetapley](https://github.com/davetapley),
[pietrodn](https://github.com/pietrodn),
[georgeharker](https://github.com/georgeharker),
[aecay](https://github.com/aecay),
[bibz](https://github.com/bibz),
[thijss](https://github.com/Thijss),
[alexmirrington](https://github.com/alexmirrington),
[tirkarthi](https://github.com/tirkarthi), 
[marksomething](https://github.com/marksomething), 
[herdigiorgi](https://github.com/herdigiorgi), 
[jochembroekhoff](https://github.com/jochembroekhoff), 
[robinklaassen](https://github.com/robinklaassen), 
[ahmetkucuk](https://github.com/ahmetkucuk), 
[casparjespersen](https://github.com/casparjespersen), 
[cypreess](https://github.com/cypreess), 
[gastlich](https://github.com/gastlich), 
[jmolinski](https://github.com/jmolinski), 
[haluzpav](https://github.com/haluzpav), 
[finetuned89](https://github.com/finetuned89)



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/ramonhagenaars/jsons",
    "name": "jsons",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.5",
    "maintainer_email": "",
    "keywords": "",
    "author": "Ramon Hagenaars",
    "author_email": "ramon.hagenaars@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/ef/38/c1c4e06725568c21b2cdab96f95450caa257b73aac90f8041af18756f3bf/jsons-1.6.3.tar.gz",
    "platform": null,
    "description": "[![Python versions](https://img.shields.io/pypi/pyversions/jsons.svg)](https://img.shields.io/pypi/pyversions/jsons.svg)\n[![Downloads](https://pepy.tech/badge/jsons)](https://pepy.tech/project/jsons)\n[![PyPI version](https://badge.fury.io/py/jsons.svg)](https://badge.fury.io/py/jsons)\n[![Code Coverage](https://codecov.io/gh/ramonhagenaars/jsons/branch/master/graph/badge.svg)](https://codecov.io/gh/ramonhagenaars/jsons)\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/ramonhagenaars/jsons/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/ramonhagenaars/jsons/?branch=master)\n\n\n<p align='center'>\n  <a href='https://jsons.readthedocs.io/en/latest/'>\n    <img width='150' src='https://github.com/ramonhagenaars/jsons/raw/master/resources/jsons-logo.svg?sanitize=true' />\n  </a>\n</p>\n\n  - *Turn Python objects into dicts or (json)strings and back*\n  - *No changes required to your objects*\n  - *Easily customizable and extendable*\n  - *Works with dataclasses, attrs and POPOs*\n\n\u00f0\u0178\u2019\u2014 this lib? Leave a \u00e2\u02dc\u2026 and tell your colleagues!\n\nExample of a model to serialize:\n\n```python\n>>> @dataclass\n... class Person:\n...    name: str\n...    birthday: datetime\n...\n>>> p = Person('Guido van Rossum', birthday_guido)\n```\n\nExample of using jsons to serialize:\n\n```python\n>>> out = jsons.dump(p)\n>>> out\n{'birthday': '1956-01-31T12:00:00Z', 'name': 'Guido van Rossum'}\n```\n\nExample of using jsons to deserialize:\n\n```python\n>>> p2 = jsons.load(out, Person)\n>>> p2\nPerson(name='Guido van Rossum', birthday=datetime.datetime(1956, 1, 31, 12, 0, tzinfo=datetime.timezone.utc))\n```\n\n# Installation\n\n    pip install jsons\n\n# Usage\n\n```python\nimport jsons\n\nsome_instance = jsons.load(some_dict, SomeClass)  # Deserialization\nsome_dict = jsons.dump(some_instance)  # Serialization\n```\n\nIn some cases, you have instances that contain other instances that need (de)serialization, for instance with lists or dicts. You can use the\n`typing` classes for this as is demonstrated below.\n\n```python\nfrom typing import List, Tuple\nimport jsons\n\n# For more complex deserialization with generic types, use the typing module\nlist_of_tuples = jsons.load(some_dict, List[Tuple[AClass, AnotherClass]])\n```\n\n(For more examples, see the\n[FAQ](https://jsons.readthedocs.io/en/latest/faq.html))\n\n# Documentation \n\n  - [Main documentation](https://jsons.readthedocs.io/en/latest/)\n  - [API docs](https://jsons.readthedocs.io/en/latest/api.html)\n  - [FAQ](https://jsons.readthedocs.io/en/latest/faq.html)\n\n# Meta\n\n## Recent updates\n\n### 1.6.3\n\n- Bugfix: a string was sometimes unintentionally parsed into a datetime.\n\n### 1.6.2\n\n- Bugfix: `fork_inst`s were not propagated in `default_list_deserializer` (thanks to patrickguenther).\n\n### 1.6.1\n\n- Bugfix: Loading dicts with hashed keys could cause an error due to being loaded twice (thanks to georgeharker).\n- Bugfix: IntEnums were not serialized with their names when `use_enum_name=True` (thanks to georgeharker).\n- Bugfix: Named tuples did not use `typing.get_type_hints` for getting the types, causing trouble in future annotations (thanks to georgeharker).\n\n### 1.6.0\n\n- Feature: Support for Python3.10.\n- Feature: Support for `attrs`.\n\n### 1.5.1\n\n- Bugfix: `ZoneInfo` failed to dump if attached to a `datetime`.\n\n### 1.5.0\n\n- Feature: Support for `ZoneInfo` on Python3.9+.\n- Change: microseconds are no longer stripped by default (thanks to pietrodn).\n\n### 1.4.2\n\n- Bugfix: get_origin did not work with python3.9+ parameterized collections (e.g. `dict[str, str]`).\n\n### 1.4.1\n\n- Bugfix: Types of attributes that are not in the constructor were not properly looked for. See issue #128.\n\n### 1.4.0\n\n- Feature: DefaultDicts can now be deserialized.\n- Feature: Dicts with any (hashable) key can now be dumped and loaded.\n- Feature: Suppress specific warnings.\n- Bugfix: Loading a verbose-serialized object in a list could sometimes deserialize that object as a parent class.\n- Bugfix: Unwanted stringification of NoneValues is now prevented in Optionals and Unions with NoneType.\n- Bugfix: Fixed a bug with postponed annotations and dataclasses. See also [Issue34776](https://bugs.python.org/issue34776).\n- Bugfix: Types of attributes that are not in the constructor are now looked for in __annotations__.\n\n### 1.3.1\n\n- Bugfix: Fixed bug where classmethods were included in the serialized result.\n\n### 1.3.0\n\n- Feature: Added `warn_on_fail` parameter to `default_list_deserializer` that allows to continue deserialization upon errors.\n- Feature: Added `transform` that can transform an object to an object of another type.\n- Feature: Added serializer and deserializer for `pathlib.Path` (thanks to alexmirrington).\n- Change: When loading a list fails, the error message now points to the failing index.\n- Bugfix: Fixed bug when dumping an object with an innerclass. \n\n### 1.2.0\n\n- Bugfix: Fixed bug with postponed typehints (PEP-563).\n- Bugfix: Loading an invalid value targeting an optional did not raise.\n- Bugfix: Loading a dict did not properly pass key_transformers.\n- Bugfix: Loading a namedtuple did not properly use key_transformers.\n- Bugfix: Utilized `__annotations__` in favor `_field_types` because of deprecation as of 3.8.\n\n### 1.1.2\n\n- Feature: Added `__version__` which can be imported from `jsons`\n- Bugfix: Dumping a tuple with ellipsis failed in strict mode.\n\n### 1.1.1\n\n  - Feature: Added a serializer for ``Union`` types.\n  - Change: Exceptions are more clear upon deserialization failure (thanks to haluzpav).\n  - Change: You can no longer announce a class with a custom name.\n  - Bugfix: Fixed dumping optional attributes.\n  - Bugfix: Dataclasses inheriting from ``JsonSerializable`` always dumped their attributes as if in strict mode. \n\n### 1.1.0\n\n  - Feature: Added ``strict`` parameter to ``dump`` to indicate that dumping a certain ``cls`` will ignore any extra data.\n  - Feature: When using ``dump(obj, cls=x)``, ``x`` can now be any class (previously, only a class with ``__slots__``).\n  - Feature: Support for dumping ``Decimal`` (thanks to herdigiorgi).\n  - Feature: Primitives are now cast if possible when dumping (e.g. ``dump(5, str)``).\n  - Feature: Dumping iterables with generic types (e.g. ``dump(obj, List[str])``) will now dump with respect to that types (if ``strict``)\n  - Feature: The ``default_dict`` serializer now optionally accepts types: ``Optional[Dict[str, type]]``.\n  - Change: Improved performance when dumping using ``strict=True`` (up to 4 times faster!).\n  - Bugfix: ``set_validator`` with multiple types did not work.\n\n### 1.0.0\n\n  - Feature: Added a serializer/deserializer for `time`.\n  - Feature: Added a serializer/deserializer for `timezone`.\n  - Feature: Added a serializer/deserializer for `timedelta`.\n  - Feature: Added a serializer/deserializer for `date`.\n  - Bugfix: Dumping verbose did not store the types of dicts (`Dict[K,\n    V]`).\n  - Bugfix: Loading with `List` (no generic type) failed.\n  - Bugfix: Loading with `Dict` (no generic type) failed.\n  - Bugfix: Loading with `Tuple` (no generic type) failed.\n\n\n## Contributors\n\nSpecial thanks to the following contributors of code, discussions or\nsuggestions:\n\n[patrickguenther](https://github.com/patrickguenther),\n[davetapley](https://github.com/davetapley),\n[pietrodn](https://github.com/pietrodn),\n[georgeharker](https://github.com/georgeharker),\n[aecay](https://github.com/aecay),\n[bibz](https://github.com/bibz),\n[thijss](https://github.com/Thijss),\n[alexmirrington](https://github.com/alexmirrington),\n[tirkarthi](https://github.com/tirkarthi), \n[marksomething](https://github.com/marksomething), \n[herdigiorgi](https://github.com/herdigiorgi), \n[jochembroekhoff](https://github.com/jochembroekhoff), \n[robinklaassen](https://github.com/robinklaassen), \n[ahmetkucuk](https://github.com/ahmetkucuk), \n[casparjespersen](https://github.com/casparjespersen), \n[cypreess](https://github.com/cypreess), \n[gastlich](https://github.com/gastlich), \n[jmolinski](https://github.com/jmolinski), \n[haluzpav](https://github.com/haluzpav), \n[finetuned89](https://github.com/finetuned89)\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "For serializing Python objects to JSON (dicts) and back",
    "version": "1.6.3",
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "md5": "381804c49060e5325be7332b610f75af",
                "sha256": "f07f8919316f72a3843c7ca6cc6c900513089f10092626934d1bfe4b5cf15401"
            },
            "downloads": -1,
            "filename": "jsons-1.6.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "381804c49060e5325be7332b610f75af",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.5",
            "size": 60701,
            "upload_time": "2022-06-09T19:51:59",
            "upload_time_iso_8601": "2022-06-09T19:51:59.266812Z",
            "url": "https://files.pythonhosted.org/packages/9a/22/e18585ccbf9f8c42f8c26435df0e551a924aae33488227eb686876d0bffd/jsons-1.6.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "md5": "3d043041792f90a97aa85b9e1d76f173",
                "sha256": "cd5815c7c6790ae11c70ad9978e0aa850d0d08a643a5105cc604eac8b29a30d7"
            },
            "downloads": -1,
            "filename": "jsons-1.6.3.tar.gz",
            "has_sig": false,
            "md5_digest": "3d043041792f90a97aa85b9e1d76f173",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.5",
            "size": 39884,
            "upload_time": "2022-06-09T19:52:01",
            "upload_time_iso_8601": "2022-06-09T19:52:01.861586Z",
            "url": "https://files.pythonhosted.org/packages/ef/38/c1c4e06725568c21b2cdab96f95450caa257b73aac90f8041af18756f3bf/jsons-1.6.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2022-06-09 19:52:01",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "github_user": "ramonhagenaars",
    "github_project": "jsons",
    "travis_ci": false,
    "coveralls": true,
    "github_actions": true,
    "lcname": "jsons"
}
        
Elapsed time: 0.03381s