[![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"
}