扁平转换成JSON JSON嵌套
问题描述:
目前我使用下面的代码嵌套JSON转换成扁平JSON:扁平转换成JSON JSON嵌套
import (
"fmt"
"github.com/nytlabs/gojsonexplode"
)
func main() {
input := `{"person":{"name":"Joe", "address":{"street":"123 Main St."}}}`
out, err := gojsonexplode.Explodejsonstr(input, ".")
if err != nil {
// handle error
}
fmt.Println(out)
}
这是输出:{"person.address.street":"123 Main St.","person.name":"Joe"}
一些处理之后,现在我想恢复这个数据到正常的嵌套json,但我无法这样做。
我最近的猜测是嵌套地图的使用,但我不知道如何创建N级别的嵌套地图。
编辑:为什么我需要这样的:我在存储数据的Redis,如果我JSON存储到Redis的话,我不能搜索键,这就是为什么我转换键进入key1:key2:key3: some_value
答
为了“解开”数据,您需要分割点上的每个键并创建嵌套对象。 Here is an example与您的Go Playground上的数据。
func unflatten(flat map[string]interface{}) (map[string]interface{}, error) {
unflat := map[string]interface{}{}
for key, value := range flat {
keyParts := strings.Split(key, ".")
// Walk the keys until we get to a leaf node.
m := unflat
for i, k := range keyParts[:len(keyParts)-1] {
v, exists := m[k]
if !exists {
newMap := map[string]interface{}{}
m[k] = newMap
m = newMap
continue
}
innerMap, ok := v.(map[string]interface{})
if !ok {
return nil, fmt.Errorf("key=%v is not an object", strings.Join(keyParts[0:i+1], "."))
}
m = innerMap
}
leafKey := keyParts[len(keyParts)-1]
if _, exists := m[leafKey]; exists {
return nil, fmt.Errorf("key=%v already exists", key)
}
m[keyParts[len(keyParts)-1]] = value
}
return unflat, nil
}
答
json.MarshalIndent是你的朋友。
j, err := json.MarshalIndent(x, "", "\t")
if err != nil {
log.Println(err)
}
log.Println(string(j))
它会以缩进的方式打印您的数据(x)。
+0
对不起,但这并没有解决我的问题,我试图将key1:key2:some_value转换为嵌套的json:{“key1”:{“key2”:“some_value”}} – Alen
为什么你不只是在处理JSON的非原始形式?没有任何额外的信息,这似乎是一个奇怪的转换。 –
因为我需要将它存储到Redis中,并且如果我将json存储到Redis中,我无法搜索特定的键。 这就是我为什么要将键转换为这个key1:key2:key3:值等。但是,在某些时候我再次需要它在json中。 – Alen
这很有道理。你有没有试图为gojsonexplode包编写一个反转函数? –