Unmarshalling
It is common to read payload (in JSON) sent from the client using the POST
or PUT
method.
In most cases, the POST
request will send the JSON representation of a Python object that will then
need to be unmarshalled to an object. This can be achieved using the entity
method of the Request
object passed to the function decorated with @route
.
Supported types:
Type | Description | Example |
---|---|---|
int |
integer | 3 |
float |
float | 3.4 |
str |
string | "test" |
boolean |
boolean | "true" |
None |
NULL value | NULL |
datetime |
datetime | "2019-02-01T02:03:04" |
datetime with timezone |
datetime with timezone | "2019-02-01T02:03:04-04:00" |
timezone |
timezone | "America/New_York" |
date |
date | "2019-04-02" |
time |
time | "14:03:12" |
data class | dataclass | dictionary representing the data class |
list |
list | [1, 2, 3] |
dict |
dictionary | {"key": "value"} |
namedtuple | named tuple | dictionary representing the named tuple |
Info
To parse datetime
, date
and time
we rely on the library dateutil and
for parsing timezone
, we use the library pytz.
In addition it supports the types specified in the Python package typing:
Type | Description | Example |
---|---|---|
List |
List | List, List[int], List[List[int]] |
Dict |
Dictionary | Dict[str, int], Dict[str, List[int]] |
Union |
Union | Union[int, str] |
Optional |
Optional (Optional[int] same as Union[int, None]) | Optional[int] |
One can nest these structures combining them with data classes (e.g., Dict[int, Item]
)
Example
We consider Item to be a data class defined as follows:
from dataclasses import dataclass @dataclass class Item(object): name: str price: float apple = Item('apple', 1.25)
Example | Description |
---|---|
r.entity(List[Float]) |
Create a list of float |
r.entity(MyDataClassObject) |
Create the data class object Item |
r.entity(List[Item]) |
Create a list of data classes Item |
r.entity(Dict[Str, Item]) |
Create a dictionary of Str -> Item |
Optionally, one can specify a JSON path. For example if the Item
is wrapped in a "data"
element:
{ "data": { "name": "pear", "price": 1.45 } }
Item can be obtained using the json path $.data
as follows:
r.entity(Item, '$.data')