{ "info": { "author": "Jorge Garcia Irazabal", "author_email": "jorge.girazabal@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Build Tools" ], "description": "# AJson (Annotations Json Serializer)\n\nAJson is a serializer based on annotations that gives a lot of flexibility and configuration for you serialization process.\n\n[![Build Status](https://travis-ci.org/JorgeGarciaIrazabal/ajson.svg?branch=master)](https://travis-ci.org/JorgeGarciaIrazabal/ajson)\n[![codecov](https://codecov.io/gh/JorgeGarciaIrazabal/ajson/branch/master/graph/badge.svg)](https://codecov.io/gh/JorgeGarciaIrazabal/ajson)\n\n\n### Install: (python3.6 or higher)\n\n`pip install ajson`\n\n#### Motivation:\n\nThere are amazing serialization libraries like [jsonpickle](https://jsonpickle.github.io/), and even more when the serialized object is meant to be used in python too. \nBut there are no libraries that let you filter fields to serialize or modify the names of the attributes. These features are super useful, mainly for http APIs\n\nThis library allows you to have those features in a simple and intuitive way.\n\n#### Serialize Examples\n\n##### Simple Serialization With \"Groups\"\nIf you want to filter some sensible data in some scenarios, you can define `groups` per attribute to control what is serialized and what is not.\n\n```python\nfrom ajson import AJson, ASerializer\n\n@AJson()\nclass Restaurant:\n location:str # @aj(groups=[\"public\",\"admin\"])\n tables: int # @aj(groups=[\"public\",\"admin\"])\n owner: str # @aj(groups=[\"admin\"])\n def __init__(self, location, tables, owner):\n self.location = location\n self.tables = tables\n self.owner = owner\n\nserializer = ASerializer()\nrestaurant = Restaurant(\"Manhattan\", 30, \"John Smith\")\nprint(serializer.serialize(restaurant, groups=[\"public\"])) \n# {\"location\": \"Manhattan\", \"tables\": 30}\nprint(serializer.serialize(restaurant, groups=[\"admin\"])) \n# {\"location\": \"Manhattan\", \"tables\": 30, \"owner\": \"John Smith\"}\n```\n\n##### Rename Attributes With \"Name\"\n\n```python\nfrom ajson import AJson\nfrom ajson.aserializer import ASerializer\n\n@AJson()\nclass Customer:\n name: str # @aj(name=firstName)\n primary_email: str # @aj(name=email)\n last_name: str # @aj(name=lastName)\n def __init__(self):\n self.name = \"John\"\n self.last_name = \"Smith\"\n self.primary_email = \"john.smith@something.com\"\n\nserializer = ASerializer()\ncustomer = Customer()\nprint(serializer.serialize(customer))\n# {\"firstName\": \"John\", \"lastName\": \"Smith\", \"email\": \"john.smith@something.com\"}\n```\n\n##### Nested Objects With Groups And Names\n\n```python\nfrom typing import List\nfrom ajson import AJson, ASerializer\n\n\n@AJson()\nclass Customer:\n name: str # @aj(name=firstName, groups=[\"public\"])\n primary_email: str\n '''\n You can also add the annotation in a multi-line docstr\n @aj(\n name=email,\n groups=[\"public\"]\n )\n '''\n\n def __init__(self, name, primary_email):\n self.name = name\n self.primary_email = primary_email\n\n@AJson()\nclass Restaurant:\n location: str # @aj(groups=[\"public\",\"admin\"])\n owner: str # @aj(groups=[\"admin\"])\n customer_list: List[Customer] # @aj(groups=[\"with_customers\"] name=customers)\n\n def __init__(self):\n self.location = None\n self.owner = \"John Smith\"\n self.customer_list = [\n Customer(\"Dani\", \"dani@something.com\"),\n Customer(\"Mike\", \"maki@something.com\")\n ]\n\nrestaurant = Restaurant()\nprint(ASerializer().serialize(restaurant, groups=[\"public\"]))\n# '{\"location\": null}'\n\n# if you want to get the dictionary instead of a string, you can call `to_dict` instead of `serialize`\nprint(ASerializer().to_dict(restaurant, groups=[\"public\", \"with_customers\"]))\n'''\n{\n \"location\": None,\n \"customers\": [\n {\"firstName\": \"Dani\", \"email\": \"dani@something.com\"},\n {\"firstName\": \"Mike\", \"email\": \"maki@something.com\"}\n ]\n}\n'''\n```\n\n#### Unserialize Examples\n\n##### UnSerialization With Custom Names\n```python\nfrom ajson import AJson, ASerializer\n\n@AJson()\nclass Customer:\n name: str # @aj(name=firstName)\n primary_email: str # @aj(name=email)\n last_name: str # @aj(name=lastName)\n\nserializer = ASerializer()\nserialize_str = '{\"firstName\": \"John\", \"lastName\": \"Smith\", \"email\": \"john.smith@something.com\"}'\ncustomer = serializer.unserialize(serialize_str, Customer)\nprint(customer.name) # \"John\"\nprint(customer.last_name) # \"Smith\"\nprint(customer.primary_email) # \"john.smith@something.com\"\n```\n\n##### Nested Objects\n\n```python\nfrom typing import List, Optional\nfrom ajson import AJson, ASerializer\n\n\n@AJson()\nclass Customer:\n def __init__(self):\n # we can also create the @aj annotation in the attribute's definition\n self.name = None # @aj(name=firstName)\n self.primary_email = None # @aj(name=email)\n\n@AJson()\nclass Restaurant:\n customer_list: List[Customer] # if we want to have nested objects, we need to define the types hints\n '''\n @aj(name=customers)\n we can create the @aj annotation in the attribute's definition\n '''\n owner: str = \"John Smith\"\n location: Optional[str] = None\n\n\nrestaurant_str = '''\n{\n \"location\": \"Spain\",\n \"customers\": [\n {\"firstName\": \"Dani\", \"email\": \"dani@something.com\"},\n {\"firstName\": \"Mike\", \"email\": \"maki@something.com\"}\n ]\n}\n'''\n\nserializer = ASerializer()\nrestaurant = serializer.unserialize(restaurant_str, Restaurant)\nprint(restaurant.owner) # \"John Smith\"\nprint(restaurant.customer_list[0].name) # \"Dani\"\n```\n\n##### Known Limitations\n\n1. Unserialize a Dict with types (Dict[str:MyObject]) is not supported, it will just unserialize it as a dict.\n\n2. Unserialize a Dict with key different than a string (Dict[int:str])\n\n#### Documentation\n\nDocumentation and additional information [here](https://jorgegarciairazabal.github.io/ajson/)\n\n#### Contributing\n\nAny contribution, feature request, or bug report is always welcome.\n\nPlease, feel free to create any issues or PRs. \n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/JorgeGarciaIrazabal/ajson", "keywords": "json serializer annotation validation", "license": "GNU General Public License v3 (GPLv3)", "maintainer": "", "maintainer_email": "", "name": "ajson", "package_url": "https://pypi.org/project/ajson/", "platform": "", "project_url": "https://pypi.org/project/ajson/", "project_urls": { "Homepage": "https://github.com/JorgeGarciaIrazabal/ajson" }, "release_url": "https://pypi.org/project/ajson/0.12.0/", "requires_dist": [ "beautifulsoup4", "typeguard (<2.3.0,>=2.2.0)" ], "requires_python": "", "summary": "simple serializer based on annotations", "version": "0.12.0" }, "last_serial": 4364744, "releases": { "0.10.0": [ { "comment_text": "", "digests": { "md5": "178dc2c6428df95bde820d71c57e5e89", "sha256": "1f192f59ee51cd8fc0aa087786c8a32aa8e2e28fc5c962d2e0ee6d437cb856de" }, "downloads": -1, "filename": "ajson-0.10.0-py3-none-any.whl", "has_sig": false, "md5_digest": "178dc2c6428df95bde820d71c57e5e89", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15724, "upload_time": "2018-08-30T03:09:13", "url": "https://files.pythonhosted.org/packages/e1/76/488f317871ddfe5f488a3aa63aee03a847b785d459e3ad9aed67231ced6b/ajson-0.10.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "95ef8181a52f5c5372e1e0a9f97e9817", "sha256": "d62ededefddd07ced63dd9bdd52c5af69f94b62a2f9416f69671f4404fd04cb1" }, "downloads": -1, "filename": "ajson-0.10.0.tar.gz", "has_sig": false, "md5_digest": "95ef8181a52f5c5372e1e0a9f97e9817", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14268, "upload_time": "2018-08-30T03:09:14", "url": "https://files.pythonhosted.org/packages/49/ee/ff84942e518de326c7206744d15744eabb87c77434de485be95cc33d11c9/ajson-0.10.0.tar.gz" } ], "0.11.0": [ { "comment_text": "", "digests": { "md5": "266942734492b8de4612ff1c768abf4d", "sha256": "ce1915b812986f587b3c74beccb56b2cee545afed385f6053a30fe10a387d9aa" }, "downloads": -1, "filename": "ajson-0.11.0-py3-none-any.whl", "has_sig": false, "md5_digest": "266942734492b8de4612ff1c768abf4d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 16687, "upload_time": "2018-09-04T05:16:20", "url": "https://files.pythonhosted.org/packages/b5/91/e6f91d60bb8154e2fc664b4bf60d6c765b5da59f1f6a6b8af2ae21c44908/ajson-0.11.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bd34393104593c92032cb1579a784eb2", "sha256": "7226270a047d90ef4158d6bf1277b08540b0ea19d694ba0f3fc502a61f679522" }, "downloads": -1, "filename": "ajson-0.11.0.tar.gz", "has_sig": false, "md5_digest": "bd34393104593c92032cb1579a784eb2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15202, "upload_time": "2018-09-04T05:16:21", "url": "https://files.pythonhosted.org/packages/ba/d6/81d10a70dc92e617f7373f72942c2d95a06d4a6a00576fe3e92dc2954e1d/ajson-0.11.0.tar.gz" } ], "0.12.0": [ { "comment_text": "", "digests": { "md5": "c3afd59890002c75f26f5d16e5cde8fe", "sha256": "7353afac07cf77337f4057aac0589f4bfcd30960b45424345104f9ae53917fa6" }, "downloads": -1, "filename": "ajson-0.12.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c3afd59890002c75f26f5d16e5cde8fe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29256, "upload_time": "2018-10-11T14:54:46", "url": "https://files.pythonhosted.org/packages/24/13/2cf9c7e49b4ab1d814bea33e49174f4fd0f2944d911c6e2d7d9c0390bfd6/ajson-0.12.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e8e4c36db6a60a1113df39669581708", "sha256": "fe347a387cfb79fc191128fb36f87ed86fe72c80e88c9be78cdec629da78aeea" }, "downloads": -1, "filename": "ajson-0.12.0.tar.gz", "has_sig": false, "md5_digest": "0e8e4c36db6a60a1113df39669581708", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15039, "upload_time": "2018-10-11T14:54:47", "url": "https://files.pythonhosted.org/packages/8e/15/991f699304047072bd305a40813e1ed754cefd2a8c24302752e334537a1c/ajson-0.12.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "624d45c98021cba03ce3117d87e0980c", "sha256": "63fec609cf18f77af9f1f5f3e31bdebc9ff8fe0b47cd80b4671002b2b490244a" }, "downloads": -1, "filename": "ajson-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "624d45c98021cba03ce3117d87e0980c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13100, "upload_time": "2018-08-25T01:31:08", "url": "https://files.pythonhosted.org/packages/bd/64/8f70304b1123c18c6bfa93a5cc2ef6bd9ceec23d92281219283633acd5c7/ajson-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d97038d872a8198a5a07f5dbf33a3d43", "sha256": "0a38ffe6e179835ec613fcb925e2abc6b9db102c5718307400125749ffbedbbd" }, "downloads": -1, "filename": "ajson-0.6.0.tar.gz", "has_sig": false, "md5_digest": "d97038d872a8198a5a07f5dbf33a3d43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9636, "upload_time": "2018-08-25T01:31:09", "url": "https://files.pythonhosted.org/packages/1c/9e/46dc2eff537347a81f970bff7b1d86baa110b7064e5a2e52bb6d7bb13799/ajson-0.6.0.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "6fb1e71bedf5ab1e07ec7b8aa43eddd8", "sha256": "70d4cca9665d68444c799500d952bcf597d303f488ff1891f2cac5b101510e19" }, "downloads": -1, "filename": "ajson-0.7.0-py3-none-any.whl", "has_sig": false, "md5_digest": "6fb1e71bedf5ab1e07ec7b8aa43eddd8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 13748, "upload_time": "2018-08-26T07:39:57", "url": "https://files.pythonhosted.org/packages/8b/12/58de1f9b72669eb90f04ae11258c86d07fb8b7a9ae4e20105267a20d706c/ajson-0.7.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "da87957f6b4658859de952f1141e09ba", "sha256": "c64c39599bb57a49e53fb87017bdc806fdb177e9164344ddfc89fb4dada03aeb" }, "downloads": -1, "filename": "ajson-0.7.0.tar.gz", "has_sig": false, "md5_digest": "da87957f6b4658859de952f1141e09ba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10223, "upload_time": "2018-08-26T07:39:58", "url": "https://files.pythonhosted.org/packages/dd/da/992c268221c4b7819f56f0bed60f42f44ffdc9a6a12a09e5fd6c287cdd90/ajson-0.7.0.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "176a20c2442a1937ff0d5cc70ba61c07", "sha256": "c2643752acd322ab5a7cfa92e771be2f6f8b5026625561d4ce64580f963cd0f0" }, "downloads": -1, "filename": "ajson-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "176a20c2442a1937ff0d5cc70ba61c07", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 14835, "upload_time": "2018-08-27T14:44:35", "url": "https://files.pythonhosted.org/packages/7d/fa/cca2b0fe2235116c9c7de4976789c83fe2b8ffc2d75c5413962c208ddee5/ajson-0.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e1318d7556c8dd15c60de59fe4654758", "sha256": "6e7fdcff72636992113aa3e92b627aa57fb130d036e7456fff09aff473ab31c5" }, "downloads": -1, "filename": "ajson-0.8.0.tar.gz", "has_sig": false, "md5_digest": "e1318d7556c8dd15c60de59fe4654758", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13288, "upload_time": "2018-08-27T14:44:36", "url": "https://files.pythonhosted.org/packages/05/95/dcb5fc9d9c4fc27ee9beafa9d6579510f8c15f7409c384e49c64e6c72e79/ajson-0.8.0.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "b9fb37db80f497854ec5d59f5e315a78", "sha256": "fd06056ed1a4b43730448b55f4de98b5a27718f94df1866dd26dbe3ae49bd544" }, "downloads": -1, "filename": "ajson-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b9fb37db80f497854ec5d59f5e315a78", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15210, "upload_time": "2018-08-28T03:45:18", "url": "https://files.pythonhosted.org/packages/8d/67/d4dd1dd98e9201bc237fcb93fa574e85e179d777718306b4416c7fb87b38/ajson-0.9.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f04a52330db74d92560608fcf15f552", "sha256": "5537c468e36dad5e8d4eabbc2a7353ffdbff8f8d21252922d51c1cbae283752b" }, "downloads": -1, "filename": "ajson-0.9.0.tar.gz", "has_sig": false, "md5_digest": "7f04a52330db74d92560608fcf15f552", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13622, "upload_time": "2018-08-28T03:45:19", "url": "https://files.pythonhosted.org/packages/20/d9/b3c5276d0ff60b6c488929f326f37d7f0fd973babec727161098572e3e29/ajson-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "b40dbba1f5f24bdb6aebaf5826db7557", "sha256": "5bccf578f5807fe032d599f3cf1c3ecb241e792a66cb4ffac0be22cc39df444f" }, "downloads": -1, "filename": "ajson-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "b40dbba1f5f24bdb6aebaf5826db7557", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15259, "upload_time": "2018-08-28T04:00:57", "url": "https://files.pythonhosted.org/packages/03/84/454cda28f35345c6324598807c82eef9261b625b198ddbfa9b6d3671013a/ajson-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9eb9ebdfd997fe646e3b643d95203e24", "sha256": "77767a77a553bd0e65796a89b3712ffa05882ea944dbffbd2bee52397bfaed44" }, "downloads": -1, "filename": "ajson-0.9.1.tar.gz", "has_sig": false, "md5_digest": "9eb9ebdfd997fe646e3b643d95203e24", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13716, "upload_time": "2018-08-28T04:00:59", "url": "https://files.pythonhosted.org/packages/6b/84/55021b276f04b9ac48b56bbc2c40393c3bec815c24bc65a2e59d70fb35bc/ajson-0.9.1.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "ee6642005a507fd5ffa81ae5f1827e26", "sha256": "451058eff19d2ef90b1cceaf87e4c58516bbbc3658d6b6f15a8aee7e8c582142" }, "downloads": -1, "filename": "ajson-0.9.3-py3-none-any.whl", "has_sig": false, "md5_digest": "ee6642005a507fd5ffa81ae5f1827e26", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 15326, "upload_time": "2018-08-28T06:22:30", "url": "https://files.pythonhosted.org/packages/f5/df/f98720363370edd016f415fc283fdbe7eb8f54c42833cd573a5427b53353/ajson-0.9.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ab699941d07a0b0f1b82f6a3a357d345", "sha256": "3e7225452c40b6635acff513b1b01c8d7d2b1a6176155c6273df767aee8b1c20" }, "downloads": -1, "filename": "ajson-0.9.3.tar.gz", "has_sig": false, "md5_digest": "ab699941d07a0b0f1b82f6a3a357d345", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13773, "upload_time": "2018-08-28T06:22:31", "url": "https://files.pythonhosted.org/packages/12/32/273a71484cf63c1b9e2e89a49a9da2e78c24895a776e006ff7f40ff1228e/ajson-0.9.3.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c3afd59890002c75f26f5d16e5cde8fe", "sha256": "7353afac07cf77337f4057aac0589f4bfcd30960b45424345104f9ae53917fa6" }, "downloads": -1, "filename": "ajson-0.12.0-py3-none-any.whl", "has_sig": false, "md5_digest": "c3afd59890002c75f26f5d16e5cde8fe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 29256, "upload_time": "2018-10-11T14:54:46", "url": "https://files.pythonhosted.org/packages/24/13/2cf9c7e49b4ab1d814bea33e49174f4fd0f2944d911c6e2d7d9c0390bfd6/ajson-0.12.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0e8e4c36db6a60a1113df39669581708", "sha256": "fe347a387cfb79fc191128fb36f87ed86fe72c80e88c9be78cdec629da78aeea" }, "downloads": -1, "filename": "ajson-0.12.0.tar.gz", "has_sig": false, "md5_digest": "0e8e4c36db6a60a1113df39669581708", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15039, "upload_time": "2018-10-11T14:54:47", "url": "https://files.pythonhosted.org/packages/8e/15/991f699304047072bd305a40813e1ed754cefd2a8c24302752e334537a1c/ajson-0.12.0.tar.gz" } ] }