2017-09-25 133 views
2

目前我使用下面的代碼嵌套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包編寫一個反轉函數? –

回答

3

爲了「解開」數據,您需要分割點上的每個鍵並創建嵌套對象。 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

0

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