Skip to main content
Join the official 2019 Python Developers SurveyStart the survey!

JSON serializable objects

Project description

https://travis-ci.org/eblade/jsonobject.svg?branch=master https://img.shields.io/pypi/v/lindh-jsonobject.svg https://img.shields.io/pypi/l/lindh-jsonobject.svg https://codecov.io/gh/eblade/jsonobject/branch/master/graph/badge.svg

lindh-jsonobject

JSON serializable python3 objects.

Introduction

The purpose with lindh.jsonobject is to provide a way to serialize and deserialize python3 objects into and from JSON so that they can be communicated with other application and stored into document databases such as CouchDB.

Some code and inspiration comes from the Django project, and the objects behave much like such. However, while Django objects are meant for relational databases, these are meant to be used with complex objects in document databases.

Dependencies

There are no dependencies besides core python3.7+

Installation

This repository can be installed with pip.

pip install lindh-jsonobject

Example

>>> from json import dumps
>>> from lindh.jsonobject import Property, PropertySet, EnumProperty

>>> class Wheel(PropertySet):
...    diameter = Property(float, default=1.)

>>> class Rating(EnumProperty):
...    ok = 'ok'
...    bad = 'bad'
...    good = 'good'

>>> class Car(PropertySet):
...    wheels = Property(type=Wheel, is_list=True)
...    brand = Property()
...    model = Property()
...    rating = Property(enum=Rating, default=Rating.ok)

>>> volvo = Car(brand='Volvo', model='V70', rating=Rating.good)
>>> print(volvo.to_json())
{
  "*schema": "Car",
  "brand": "Volvo",
  "model": "V70",
  "rating": "good",
  "wheels": []
}

>>> volvo.wheels.append(Wheel(diameter=2.))
>>> print(volvo.to_json())
{
  "*schema": "Car",
  "brand": "Volvo",
  "model": "V70",
  "rating": "good",
  "wheels": [
    {
      "*schema": "Wheel",
      "diameter": 2.0
    }
  ]
}

>>> volvo.wheels.append(Wheel(diameter=2.))
>>> print(volvo.to_json())
{
  "*schema": "Car",
  "brand": "Volvo",
  "model": "V70",
  "rating": "good",
  "wheels": [
    {
      "*schema": "Wheel",
      "diameter": 2.0
    },
    {
      "*schema": "Wheel",
      "diameter": 2.0
    }
  ]
}

>>> volvo.wheels.append(Wheel(diameter=2.))
>>> volvo.wheels.append(Wheel())  # using default value here
>>> print(volvo.to_json())
{
  "*schema": "Car",
  "brand": "Volvo",
  "model": "V70",
  "rating": "good",
  "wheels": [
    {
      "*schema": "Wheel",
      "diameter": 2.0
    },
    {
      "*schema": "Wheel",
      "diameter": 2.0
    },
    {
      "*schema": "Wheel",
      "diameter": 2.0
    },
    {
      "*schema": "Wheel",
      "diameter": 1.0
    }
  ]
}

>>> volvo2 = Car.FromJSON(volvo.to_json())
>>> print(volvo2.to_json())
{
  "*schema": "Car",
  "brand": "Volvo",
  "model": "V70",
  "rating": "good",
  "wheels": [
    {
      "*schema": "Wheel",
      "diameter": 2.0
    },
    {
      "*schema": "Wheel",
      "diameter": 2.0
    },
    {
      "*schema": "Wheel",
      "diameter": 2.0
    },
    {
      "*schema": "Wheel",
      "diameter": 1.0
    }
  ]
}

Type Hinting

You can also specify types for properties with Type Hinting, if available:

>>> from json import dumps
>>> from typing import List
>>> from lindh.jsonobject import Property, PropertySet, EnumProperty

>>> class Wheel(PropertySet):
...    diameter: float = Property(default=1.)

>>> class Rating(EnumProperty):
...    ok = 'ok'
...    bad = 'bad'
...    good = 'good'

>>> class Car(PropertySet):
...    wheels: List[Wheel] = Property()
...    brand = Property()
...    model = Property()
...    rating: Rating = Property(default=Rating.ok)

>>> volvo = Car(brand='Volvo', model='V90', rating=Rating.good, wheels=[])
>>> volvo.wheels.append(Wheel(diameter=3.))
>>> print(volvo.to_json())
{
  "*schema": "Car",
  "brand": "Volvo",
  "model": "V90",
  "rating": "good",
  "wheels": [
    {
      "*schema": "Wheel",
      "diameter": 3.0
    }
  ]
}

Supported types:

  • str
  • int
  • float
  • bool
  • dict
  • typing.List[T] where T is a subclass of PropertySet
  • T where T is a subclass of EnumProperty

Schema-Less

There is also included a “schema-less” mode, found under lindh.jsonobject.noschema. The idea is to provide an easy-to-use read-only LINQ-like way of exploring JSON-like files. Here is a small example:

>>> from lindh.jsonobject import Dictionary
>>> d = Dictionary.load('tests/test.json')
>>> palle = (d.drivers
...     .where(lambda x: x.name == "Palle Kuling")
...     .join(d.cars, lambda driver, car: driver.car_brand == car.brand and driver.car_model == car.model)
...     .single())
>>> palle.rating
'good'

You can also use chained methods like select(expr), first() and extend(**items).

Author

lindh.jsonobject is written and maintained by Johan Egneblad <johan@egneblad.se>.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for lindh-jsonobject, version 1.4.0
Filename, size File type Python version Upload date Hashes
Filename, size lindh_jsonobject-1.4.0-py3-none-any.whl (8.0 kB) File type Wheel Python version py3 Upload date Hashes View hashes
Filename, size lindh-jsonobject-1.4.0.tar.gz (7.4 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN SignalFx SignalFx Supporter DigiCert DigiCert EV certificate StatusPage StatusPage Status page