2017-09-25 18 views
2

にJSONを平坦化し、いくつかの処理の後{"person.address.street":"123 Main St.","person.name":"Joe"}変換は、現在、私は平らにJSONにネストされたJSONを変換するには、次のコードを使用していネストされたJSON

、今私がしたいですこのデータを通常のネストされたjsonに復元しますが、できません。

私の最も近い推測はネストマップの使用ですが、Nレベルのネストマップの作成方法はわかりません。

編集:私はこれを必要とする理由:私はRedisの中にデータを格納しています、と私はRedisのにJSONを保存するならば、私は、キーを検索することができない、私はkey1:key2:key3: some_value

+0

JSONをネストされていない形式で処理しているのはなぜですか?追加情報がなければ、それは奇妙な変換のように思えます。 –

+0

私はRedisに格納する必要があるので、Redisにjsonを格納すると特定のキーを検索できません。 それは私がなぜkey1にキーを変換するのですか?key2:key3:valueなどです。しかし、ある時点で私は再び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

フラット化されたバージョンはあいまいです。 '{" x "':" z "から{{" x "}"}へと '{" "" x "}"や '{" x ":" 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

関連する問題