#json-object #json #json-key #serde-json #object #flatten #serde

flatten-json-object

Tiny Rust library for flattening JSON objects

9 releases (5 breaking)

0.6.1 Apr 16, 2022
0.6.0 Apr 15, 2022
0.5.0 Apr 13, 2022
0.4.0 Apr 12, 2022
0.1.2 Apr 5, 2022

#1632 in Encoding

Download history 360/week @ 2023-12-06 355/week @ 2023-12-13 436/week @ 2023-12-20 96/week @ 2023-12-27 621/week @ 2024-01-03 759/week @ 2024-01-10 871/week @ 2024-01-17 887/week @ 2024-01-24 655/week @ 2024-01-31 884/week @ 2024-02-07 724/week @ 2024-02-14 1054/week @ 2024-02-21 968/week @ 2024-02-28 899/week @ 2024-03-06 920/week @ 2024-03-13 739/week @ 2024-03-20

3,806 downloads per month
Used in 3 crates

MIT license

23KB
395 lines

licence crates.io docs.rs ci

Robust Rust library for flattening JSON objects

Given a JSON object it produces another one with all the nested objects and arrays flattened. The string used to separate the concatenated keys, and the way the arrays are formatted can be configured.

Notes

  • Empty arrays and objects are ignored by default, but it's configurable.
  • The empty key "" and the JSON null value can be used without problems and are preserved.
  • Having two or more keys that end being the same after flattening the object returns an error.
  • The JSON value passed to be flattened must be an object. The object can contain any valid JSON, though.

Usage

In your Cargo.toml

[dependencies]
flatten-json-object = "0.6.1"

Example

use flatten_json_object::ArrayFormatting;
use flatten_json_object::Flattener;
use serde_json::json;

let obj = json!({
    "a": {
        "b": [1, 2.0, "c", null, true, {}, []],
        "" : "my_key_is_empty"
    },
    "" : "my_key_is_also_empty"
});
assert_eq!(
    Flattener::new()
        .set_key_separator(".")
        .set_array_formatting(ArrayFormatting::Surrounded {
            start: "[".to_string(),
            end: "]".to_string()
        })
        .set_preserve_empty_arrays(false)
        .set_preserve_empty_objects(false)
        .flatten(&obj)?,
    json!({
        "a.b[0]": 1,
        "a.b[1]": 2.0,
        "a.b[2]": "c",
        "a.b[3]": null,
        "a.b[4]": true,
        "a.": "my_key_is_empty",
        "": "my_key_is_also_empty",
    })
);

A trivial example that reads JSON from stdin and outputs the converted flat JSON to stdout can be found in examples/from_stdin.rs. To run it execute cargo run --example from_stdin.

Dependencies

~0.7–1.4MB
~32K SLoC