扁平转换成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

+0

为什么你不只是在处理JSON的非原始形式?没有任何额外的信息,这似乎是一个奇怪的转换。 –

+0

因为我需要将它存储到Redis中,并且如果我将json存储到Redis中,我无法搜索特定的键。 这就是我为什么要将键转换为这个key1:key2:key3:值等。但是,在某些时候我再次需要它在json中。 – Alen

+0

这很有道理。你有没有试图为gojsonexplode包编写一个反转函数? –

为了“解开”数据,您需要分割点上的每个键并创建嵌套对象。 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 
} 
+0

男人,你绝对是真棒。谢谢1000倍 – Alen

+2

请注意,扁平版本是不明确的。您无法从'{“xy”:“z'区分''”x“]与'{”0“:”x“}',或'{”x“:{”y“:”z“}}'' “}'。所以要小心你的输入。 – Peter

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