blob: 7b7df43d362bb275c055cb3a31aa5ff5e1e29d7a [file] [log] [blame] [view]
# JsonGet - match and extract data ergonomically from JSON lists and dicts
json_get has one class, JsonGet, with one method, match().
## Create the JSON object
JsonGet('{"string": "formatted in JSON"}')
JsonGet(value=["Any", "JSON-like", "data"])
## Match and extract data
Match by passing a data structure into ``match() - there's no separate DSL. If the data structure
matches, a JsonMatch object will be returned, containing the matched data; if the match fails,
None will be returned.
Wildcards for dictionary keys:
- `Any` matches any data. If used as a value in a dictionary, the key must exist.
- `Maybe` matches any data, and if a key is missing, that key will be added with value `None`.
- `None` as a value in a dictionary requires that the key _not_ be present.
Any is also a wildcard for list patterns, and for matching any data object.
`Any` and `Maybe` return shallow copies of the data they match, so the original structure can be
modified.
` def match(self, pattern, callback=None, no_match=None)`
In addition, a 1-argument function passed as `callback` will be called with a successful match,
and a 0-argument function passed as `no_match` will be called if the match fails.
```
from json_get import JsonGet, Any, Maybe # Any is typing.Any
j = JsonGet('{"a": 1, "b": [7, 8, {"nested": 42}]})
print(j.match({"a": Any}).a) # prints 1
print(j.match({"a": Any}).b) # Error - the returned object doesn't have a field `b`
print(j.match({"b": [{"nested": Any}])).b.nested # prints 42
print(j.match({"b": [7])).b # prints [7]
print(j.match({"b": [Any])).b # prints [7, 8, {"nested": 42}]
```
### Dictionary patterns
`Maybe` and `None` are only meaningful as dictionary values. Keys must match exactly, and must be
valid Python object-member names.
### List patterns
A list in a pattern must contain exactly one item. The corresponding data must be a list. Each
element of that list that matches the pattern will be added to the returned list. If nothing
matches, the returned value is [] rather than None. To match an entire list, use [Any].