parent
0e6fdc0c5c
commit
00270d811b
@ -0,0 +1,63 @@ |
||||
# json_dotpath |
||||
|
||||
Access members of nested JSON arrays and objects using "dotted paths". |
||||
|
||||
The `DotPaths` trait is implemented for `serde_json::Value`, |
||||
`serde_json::Map<String, serde_json::Value>`, and `Vec<serde_json::Value>`. |
||||
|
||||
Any serializable type or `serde_json::Value` can be stored to or retrieved from |
||||
the nested object. Any value stored in the object can also be modified in place |
||||
by getting a mutable reference. |
||||
|
||||
This crate is useful for tasks such as working with dynamic JSON API payloads, |
||||
parsing config files, or polymorphic data store. |
||||
|
||||
## Supported Operations |
||||
|
||||
### Object and Array |
||||
- Set (dropping the original value, if any) |
||||
- Remove (remove and drop a value) |
||||
- Take (remove a value and deserialize it) |
||||
- Replace (take and set) |
||||
- Get (find & deserialize) |
||||
- Get a mutable reference to a Value |
||||
|
||||
### Array |
||||
Array is an ordered sequence backed by a Vec. It has these additional operations: |
||||
|
||||
- Prepend |
||||
- Append |
||||
- Insert, shifting the following elements |
||||
- Get the last element |
||||
|
||||
### Null |
||||
JSON null can become an array or object by setting it's members (even nested), as if it was an array or object. |
||||
It becomes an array or object of the appropriate type based on the root key. |
||||
|
||||
## Dotted Path Syntax |
||||
|
||||
Array keys must be numeric (integer), or one of the special patterns listed below. |
||||
|
||||
To avoid ambiguity, it's not allowed to use numeric keys (or keys starting with a number) |
||||
as map keys. Map keys must start with an ASCII letter or underscore and must not contain a dot (`.`). |
||||
|
||||
### Array Index Patterns |
||||
|
||||
- `-` ... prepend |
||||
- `<` ... prepend (or get first) |
||||
- `+` ... append |
||||
- `>` ... append (or get last) |
||||
- `<n`, e.g. `<5` ... insert before the n-th element |
||||
- `>n`, e.g. `>5` ... insert after the n-th element |
||||
|
||||
### Path Examples |
||||
|
||||
- Empty path ... access the root element |
||||
- `5` ... get the element `"five"` from `[0,1,2,3,4,"five"]` |
||||
- `a.b.c` ... get `1` from `{ "a": { "b": { "c": 1 } } }` |
||||
- `a.0.x` ... get `1` from `{ "a": [ { "x": 1 } ] }` |
||||
|
||||
It's possible to create nested arrays or objects by setting a non-existent path, |
||||
provided the key syntax rules are maintained. |
||||
|
||||
See unit tests for more examples. |
Loading…
Reference in new issue