{"id":13770242,"url":"https://github.com/beregond/jsonmodels","last_synced_at":"2025-05-11T02:35:19.029Z","repository":{"id":61421558,"uuid":"217461817","full_name":"beregond/jsonmodels","owner":"beregond","description":"jsonmodels is library to make it easier for you to deal with structures that are converted to, or read from JSON.","archived":false,"fork":true,"pushed_at":"2023-12-19T17:00:36.000Z","size":435,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-08-03T17:09:08.727Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://jsonmodels.readthedocs.org/en/latest/","language":null,"has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jazzband/jsonmodels","license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beregond.png","metadata":{"files":{"readme":"README.rst","changelog":"HISTORY.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-10-25T06:00:46.000Z","updated_at":"2023-07-12T21:02:49.000Z","dependencies_parsed_at":"2023-02-13T23:31:24.971Z","dependency_job_id":null,"html_url":"https://github.com/beregond/jsonmodels","commit_stats":null,"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beregond%2Fjsonmodels","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beregond%2Fjsonmodels/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beregond%2Fjsonmodels/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beregond%2Fjsonmodels/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beregond","download_url":"https://codeload.github.com/beregond/jsonmodels/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":225008470,"owners_count":17406290,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T17:00:35.514Z","updated_at":"2024-11-17T06:30:31.960Z","avatar_url":"https://github.com/beregond.png","language":null,"readme":"===========\nJSON models\n===========\n\n.. image:: https://badge.fury.io/py/jsonmodels.png\n    :target: http://badge.fury.io/py/jsonmodels\n\n.. image:: https://travis-ci.org/beregond/jsonmodels.png?branch=master\n    :target: https://travis-ci.org/beregond/jsonmodels\n\n.. image:: https://img.shields.io/pypi/dm/jsonmodels.svg\n    :target: https://pypi.python.org/pypi/jsonmodels\n\n.. image:: https://coveralls.io/repos/beregond/jsonmodels/badge.png\n    :target: https://coveralls.io/r/beregond/jsonmodels\n\n\n`jsonmodels` is library to make it easier for you to deal with structures that\nare converted to, or read from JSON.\n\n* Free software: BSD license\n* Documentation: http://jsonmodels.rtfd.org\n* Source: https://github.com/beregond/jsonmodels\n\nFeatures\n--------\n\n* Fully tested with Python 2.7, 3.3, 3.4, 3.5, 3.6.\n\n* Support for PyPy (see implementation notes in docs for more details).\n\n* Create Django-like models:\n\n  .. code-block:: python\n\n    from jsonmodels import models, fields, errors, validators\n\n\n    class Cat(models.Base):\n\n        name = fields.StringField(required=True)\n        breed = fields.StringField()\n        love_humans = fields.IntField(nullable=True)\n\n\n    class Dog(models.Base):\n\n        name = fields.StringField(required=True)\n        age = fields.IntField()\n\n\n    class Car(models.Base):\n\n        registration_number = fields.StringField(required=True)\n        engine_capacity = fields.FloatField()\n        color = fields.StringField()\n\n\n    class Person(models.Base):\n\n        name = fields.StringField(required=True)\n        surname = fields.StringField(required=True)\n        nickname = fields.StringField(nullable=True)\n        car = fields.EmbeddedField(Car)\n        pets = fields.ListField([Cat, Dog], nullable=True)\n\n* Access to values through attributes:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e cat = Cat()\n    \u003e\u003e\u003e cat.populate(name='Garfield')\n    \u003e\u003e\u003e cat.name\n    'Garfield'\n    \u003e\u003e\u003e cat.breed = 'mongrel'\n    \u003e\u003e\u003e cat.breed\n    'mongrel'\n\n* Validate models:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e person = Person(name='Chuck', surname='Norris')\n    \u003e\u003e\u003e person.validate()\n    None\n\n    \u003e\u003e\u003e dog = Dog()\n    \u003e\u003e\u003e dog.validate()\n    *** ValidationError: Field \"name\" is required!\n\n* Cast models to python struct and JSON:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e cat = Cat(name='Garfield')\n    \u003e\u003e\u003e dog = Dog(name='Dogmeat', age=9)\n    \u003e\u003e\u003e car = Car(registration_number='ASDF 777', color='red')\n    \u003e\u003e\u003e person = Person(name='Johny', surname='Bravo', pets=[cat, dog])\n    \u003e\u003e\u003e person.car = car\n    \u003e\u003e\u003e person.to_struct()\n    {\n        'car': {\n            'color': 'red',\n            'registration_number': 'ASDF 777'\n        },\n        'surname': 'Bravo',\n        'name': 'Johny',\n        'nickname': None,\n        'pets': [\n            {'name': 'Garfield'},\n            {'age': 9, 'name': 'Dogmeat'}\n        ]\n    }\n\n    \u003e\u003e\u003e import json\n    \u003e\u003e\u003e person_json = json.dumps(person.to_struct())\n\n* You don't like to write JSON Schema? Let `jsonmodels` do it for you:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e person = Person()\n    \u003e\u003e\u003e person.to_json_schema()\n    {\n        'additionalProperties': False,\n        'required': ['surname', 'name'],\n        'type': 'object',\n        'properties': {\n            'car': {\n                'additionalProperties': False,\n                'required': ['registration_number'],\n                'type': 'object',\n                'properties': {\n                    'color': {'type': 'string'},\n                    'engine_capacity': {'type': ''},\n                    'registration_number': {'type': 'string'}\n                }\n            },\n            'surname': {'type': 'string'},\n            'name': {'type': 'string'},\n            'nickname': {'type': ['string', 'null']}\n            'pets': {\n                'items': {\n                    'oneOf': [\n                        {\n                            'additionalProperties': False,\n                            'required': ['name'],\n                            'type': 'object',\n                            'properties': {\n                                'breed': {'type': 'string'},\n                                'name': {'type': 'string'}\n                            }\n                        },\n                        {\n                            'additionalProperties': False,\n                            'required': ['name'],\n                            'type': 'object',\n                            'properties': {\n                                'age': {'type': 'number'},\n                                'name': {'type': 'string'}\n                            }\n                        },\n                        {\n                            'type': 'null'\n                        }\n                    ]\n                },\n                'type': 'array'\n            }\n        }\n    }\n\n* Validate models and use validators, that affect generated schema:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e class Person(models.Base):\n    ...\n    ...     name = fields.StringField(\n    ...         required=True,\n    ...         validators=[\n    ...             validators.Regex('^[A-Za-z]+$'),\n    ...             validators.Length(3, 25),\n    ...         ],\n    ...     )\n    ...     age = fields.IntField(\n    ...         nullable=True,\n    ...         validators=[\n    ...             validators.Min(18),\n    ...             validators.Max(101),\n    ...         ]\n    ...     )\n    ...     nickname = fields.StringField(\n    ...         required=True,\n    ...         nullable=True\n    ...     )\n    ...\n\n    \u003e\u003e\u003e person = Person()\n    \u003e\u003e\u003e person.age = 11\n    \u003e\u003e\u003e person.validate()\n    *** ValidationError: '11' is lower than minimum ('18').\n    \u003e\u003e\u003e person.age = None\n    \u003e\u003e\u003e person.validate()\n    None\n\n    \u003e\u003e\u003e person.age = 19\n    \u003e\u003e\u003e person.name = 'Scott_'\n    \u003e\u003e\u003e person.validate()\n    *** ValidationError: Value \"Scott_\" did not match pattern \"^[A-Za-z]+$\".\n\n    \u003e\u003e\u003e person.name = 'Scott'\n    \u003e\u003e\u003e person.validate()\n    None\n\n    \u003e\u003e\u003e person.nickname = None\n    \u003e\u003e\u003e person.validate()\n    *** ValidationError: Field is required!\n\n    \u003e\u003e\u003e person.to_json_schema()\n    {\n        \"additionalProperties\": false,\n        \"properties\": {\n            \"age\": {\n                \"maximum\": 101,\n                \"minimum\": 18,\n                \"type\": [\"number\", \"null\"]\n            },\n            \"name\": {\n                \"maxLength\": 25,\n                \"minLength\": 3,\n                \"pattern\": \"/^[A-Za-z]+$/\",\n                \"type\": \"string\"\n            },\n            \"nickname\": {,\n                \"type\": [\"string\", \"null\"]\n            }\n        },\n        \"required\": [\n            \"nickname\",\n            \"name\"\n        ],\n        \"type\": \"object\"\n    }\n\n  For more information, please see topic about validation in documentation.\n\n* Lazy loading, best for circular references:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e class Primary(models.Base):\n    ...\n    ...     name = fields.StringField()\n    ...     secondary = fields.EmbeddedField('Secondary')\n\n    \u003e\u003e\u003e class Secondary(models.Base):\n    ...\n    ...    data = fields.IntField()\n    ...    first = fields.EmbeddedField('Primary')\n\n  You can use either `Model`, full path `path.to.Model` or relative imports\n  `.Model` or `...Model`.\n\n* Using definitions to generate schema for circular references:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e class File(models.Base):\n    ...\n    ...     name = fields.StringField()\n    ...     size = fields.FloatField()\n\n    \u003e\u003e\u003e class Directory(models.Base):\n    ...\n    ...     name = fields.StringField()\n    ...     children = fields.ListField(['Directory', File])\n\n    \u003e\u003e\u003e class Filesystem(models.Base):\n    ...\n    ...     name = fields.StringField()\n    ...     children = fields.ListField([Directory, File])\n\n    \u003e\u003e\u003e Filesystem.to_json_schema()\n    {\n        \"type\": \"object\",\n        \"properties\": {\n            \"name\": {\"type\": \"string\"}\n            \"children\": {\n                \"items\": {\n                    \"oneOf\": [\n                        \"#/definitions/directory\",\n                        \"#/definitions/file\"\n                    ]\n                },\n                \"type\": \"array\"\n            }\n        },\n        \"additionalProperties\": false,\n        \"definitions\": {\n            \"directory\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                    \"children\": {\n                        \"items\": {\n                            \"oneOf\": [\n                                \"#/definitions/directory\",\n                                \"#/definitions/file\"\n                            ]\n                        },\n                        \"type\": \"array\"\n                    },\n                    \"name\": {\"type\": \"string\"}\n                },\n                \"type\": \"object\"\n            },\n            \"file\": {\n                \"additionalProperties\": false,\n                \"properties\": {\n                    \"name\": {\"type\": \"string\"},\n                    \"size\": {\"type\": \"number\"}\n                },\n                \"type\": \"object\"\n            }\n        }\n    }\n\n* Compare JSON schemas:\n\n  .. code-block:: python\n\n    \u003e\u003e\u003e from jsonmodels.utils import compare_schemas\n    \u003e\u003e\u003e schema1 = {'type': 'object'}\n    \u003e\u003e\u003e schema2 = {'type': 'array'}\n    \u003e\u003e\u003e compare_schemas(schema1, schema1)\n    True\n    \u003e\u003e\u003e compare_schemas(schema1, schema2)\n    False\n\nMore\n----\n\nFor more examples and better description see full documentation:\nhttp://jsonmodels.rtfd.org.\n","funding_links":[],"categories":["Model, Schema","Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberegond%2Fjsonmodels","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fberegond%2Fjsonmodels","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fberegond%2Fjsonmodels/lists"}