Skip to content

latonis/smooth-json

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

smooth-json

Publish Status

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 or what would be needed for VAST's DB and Table integrations.

Features

  • Flatten 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

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

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.

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)

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"
    }
    */

About

A JSON flattening utility and library written in Rust

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages