https://github.com/nqd/flat
Flatten/unflatten nested map or JSON object in Golang
https://github.com/nqd/flat
flat flatten golang json struct
Last synced: about 1 month ago
JSON representation
Flatten/unflatten nested map or JSON object in Golang
- Host: GitHub
- URL: https://github.com/nqd/flat
- Owner: nqd
- License: mit
- Created: 2019-01-10T15:32:46.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2023-04-24T18:02:50.000Z (almost 3 years ago)
- Last Synced: 2025-08-13T18:42:58.437Z (6 months ago)
- Topics: flat, flatten, golang, json, struct
- Language: Go
- Size: 50.8 KB
- Stars: 69
- Watchers: 1
- Forks: 18
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# flat [](http://travis-ci.org/nqd/flat)
Take a golang map and flatten it or unfatten a map with delimited key.
This work inspired by the [nodejs flat package](https://github.com/hughsk/flat/)
## Method
### Flatten
Flatten given map, returns a map one level deep.
```{go}
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.
```{go}
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 `.`.
```{go}
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`.
```{go}
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`.
```{go}
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