Description
A Python (3.5+) lib for easily and deeply serializing Python objects to dicts or strings and for deserializing dicts or strings to Python objects using type hints.
jsons alternatives and similar packages
Based on the "Serialization" category.
Alternatively, view jsons alternatives based on common mentions on social networks and blogs.
-
marshmallow
A lightweight library for converting complex objects to and from simple Python datatypes. -
RDFLib plugin providing JSON-LD parsing and serialization
DISCONTINUED. JSON-LD parser and serializer plugins for RDFLib -
lupin is a Python JSON object mapper
Python document object mapper (load python object from JSON and vice-versa) -
py-object-factory
objectfactory is a python package to easily implement the factory design pattern for object creation, serialization, and polymorphism
SaaSHub - Software Alternatives and Reviews
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of jsons or a related project?
README
- Turn Python objects into dicts or (json)strings
- No changes required to your objects
- Easily customizable and extendable
๐ this lib? Leave a โ and tell your colleagues!
Example of a model to serialize:
>>> @dataclass
... class Person:
... name: str
... birthday: datetime
...
>>> p = Person('Guido van Rossum', birthday_guido)
Example of using jsons to serialize:
>>> out = jsons.dump(p)
>>> out
{'birthday': '1956-01-31T12:00:00Z', 'name': 'Guido van Rossum'}
Example of using jsons to deserialize:
>>> 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
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.
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)
Documentation
Meta
Recent updates
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.
- 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 todefault_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 fromjsons
- 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 todump
to indicate that dumping a certaincls
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 (ifstrict
) - 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:
georgeharker, aecay, bibz, thijss, alexmirrington, tirkarthi, marksomething, herdigiorgi, jochembroekhoff, robinklaassen, ahmetkucuk, casparjespersen, cypreess, gastlich, jmolinski, haluzpav, finetuned89