Skip to content
/ flat Public

Flatten/unflatten nested map or JSON object in Golang

License

Notifications You must be signed in to change notification settings

nqd/flat

Folders and files

NameName
Last commit message
Last commit date
Dec 3, 2022
Dec 3, 2022
Jan 10, 2019
Dec 3, 2022
Jan 20, 2019
Jan 21, 2019
Dec 3, 2022
Dec 3, 2022
Sep 28, 2021
Sep 28, 2021

Repository files navigation

flat Build Status

Take a golang map and flatten it or unfatten a map with delimited key.

This work inspired by the nodejs flat package

Method

Flatten

Flatten given map, returns a map one level deep.

in := map[string]interface{}{
    "a": "b",
    "c": map[string]interface{}{
        "d": "e",
        "f": "g",
    },
    "z": [2, 1.4567],
}

out, err := flat.Flatten(in, nil)
// out = map[string]interface{}{
//     "a": "b",
//     "c.d": "e",
//     "c.f": "g",
//     "z.0": 2,
//     "z.1": 1.4567,
// }

Unflatten

Since there is flatten, flat should have unfatten.

in := map[string]interface{}{
    "foo.bar": map[string]interface{}{"t": 123},
    "foo":     map[string]interface{}{"k": 456},
}

out, err := flat.Unflatten(in, nil)
// out = map[string]interface{}{
//     "foo": map[string]interface{}{
//         "bar": map[string]interface{}{
//             "t": 123,
//         },
//         "k": 456,
//     },
// }

Options

Delimiter

Use a custom delimiter for flattening/unflattening your objects. Default value is ..

in := map[string]interface{}{
   "hello": map[string]interface{}{
       "world": map[string]interface{}{
           "again": "good morning",
        }
    },
}

out, err := flat.Flatten(in, &flat.Options{
    Delimiter: ":",
})
// out = map[string]interface{}{
//     "hello:world:again": "good morning",
// }

Safe

When Safe is true, fatten will preserve arrays and their contents. Default Safe value is false.

in := map[string]interface{}{
    "hello": map[string]interface{}{
        "world": []interface{}{
            "one",
            "two",
        }
   },
}

out, err := flat.Flatten(in, &flat.Options{
    Delimiter: ".",
    Safe:      true,
})
// out = map[string]interface{}{
//     "hello.world": []interface{}{"one", "two"},
// }

MaxDepth

MaxDepth is the maximum number of nested objects to flatten. MaxDepth can be any integer number. MaxDepth = 0 means no limit.

Default MaxDepth value is 0.

in := map[string]interface{}{
    "hello": map[string]interface{}{
        "world": []interface{}{
            "again": "good morning",
        }
   },
}

out, err := flat.Flatten(in, &flat.Options{
    Delimiter: ".",
    MaxDepth:  2,
})
// out = map[string]interface{}{
//     "hello.world": map[string]interface{}{"again": "good morning"},
// }

Todos

  • Safe option for Unflatten
  • Overwrite