smooth-json 0.2.7

smooth-json is an opinionated, customizable utility to flatten serde_json Value variants into serde_json Objects ready for use in columnar or table-like usages.
Documentation
# smooth-json
![Publish Status](https://github.com/latonis/smooth-json/actions/workflows/publish.yml/badge.svg)

This crate allows for flattening JSON objects into objects ready for use in Parquet, CSV, or other data formats.

The flattening is similar to ElasticSearch's [ingestion flattening](https://www.elastic.co/guide/en/elasticsearch/reference/current/nested.html) or what would be needed for VAST's DB and Table [integrations](https://vastdata.com/platform/database).

## Features
- Flatten [serde_json]https://docs.rs/serde_json/latest/serde_json/'s `Value` variants into structures suitable for use with applications that are expecting table formatted data or columnar data formats.
- Pass a custom separator by instantiating a `Flattener` and passing the separator.
- Use an opinionated flattening format that places values in an array if the object is nested inside an array
  
## Examples

### Standard Usage
```rust
use smooth_json;
use serde_json::json;

fn main() {
    let flattener = smooth_json::Flattener::new();

    let example = json!({
        "name": "John Doe",
        "age": 43,
        "address": {
            "street": "10 Downing Street",
            "city": "London"
        },
        "phones": [
            "+44 1234567",
            "+44 2345678"
        ]
    });

    let flattened_example = flattener.flatten(&example);
    
    println!("{}", flattened_example);
    /*
    {
        "address.city": "London",
        "address.street": "10 Downing Street",
        "age": 43,
        "name": "John Doe",
        "phones": [
            "+44 1234567",
            "+44 2345678"
        ]
    }
    */
}
```

### Custom Separator Usage
```rust
use serde_json::json;
use smooth_json;

fn main() {
    let flattener = smooth_json::Flattener{ 
        separator: "$", 
        ..Default::default()
    };

    let example = json!({
        "a": {
            "b": 1
        }});

    let flattened_example = flattener.flatten(&example);

    println!("{}", flattened_example);
    /*
    {
        "a$b": 1
    }
    */
}
```

### Opinionated Flattening
If an object is present in an array, the result will be in an array when flattened.
```rust
use serde_json::json;
use smooth_json;

fn main() {
    let flattener = smooth_json::Flattener{ 
        alt_array_flattening: true,
        ..Default::default()
    };

    let example = json!({
          "a": [
            ["b", "c"],
            { "d": "e" },
            ["f", "g"],
            [
                { "h": "i" },
                { "d": "j" },
            ],
            ["k", "l"],
          ]
        });

    let flattened_example = flattener.flatten(&example);

    println!("{}", flattened_example);
    /*
    {
        "a": ["b", "c", "f", "g", "k", "l"],
        "a.d": ["e", "j"],
        "a.h": ["i"],
    }
    */
}
```

### Completely Flat JSON (keep array position in key)
```rust
use serde_json::json;
use smooth_json;

fn main() {
    let flattener = smooth_json::Flattener{ 
        preserve_arrays: true,
        ..Default::default()
    };

    let example: Value = json!({
        "a": [
            "b",
            ["c", "d"],
        ]
    });

    let flattened_example = flattener.flatten(&example);
    println!("{}", flattened_example);
    /*
    {
        "a.0": "b",
        "a.1.0": "c",
        "a.1.1": "d"
    }
    */
```