2017-08-02 16 views
0

複雑なJSONオブジェクトをgolangのすべての適切なタイプのマップに変換する方法を教えてください。私は絶対に、私が知っているフィールドを持つ構造体を作成する一般的なGolangのことをしなければならないのでしょうか、それとも、すべての正しい型のフィールドを取得する一般的な方法がありますか?ここで複雑なJSONをGolangでマップするように変換する

は私がマップに変身したいJSONの例です。

{ 
    "people": [ 
     { 
      "diffs": [ 
       77 
      ], 
      "original": { 
       "name": "Nick", 
       "active": "Active", 
       "email": "[email protected]" 
      }, 
      "id": "21" 
     } 
    ] 
} 
+0

静的型付けされた言語ようこそ。 'json'パッケージを使うと、いつでも' map [string] interface {} 'に非マーシャルできますが、これは通常あなたが本当に望むものではありません。 – RayfenWindspear

答えて

1

あなたは多次元マップにJSON配列を主張型に型アサーションスイッチで再帰関数を構築することができフラット化されたマップです。残念ながら、あなたの多次元地図は本当に素早く複雑になるでしょう。

私が言っていることは、少なくともいくつかのディメンション(map [string] map [string] map [string] string)をマップする必要があることです。上記の "人々"

ネストされたJSON配列を平坦化しようとすると、キーが重複してしまう(つまり、「名前」キーは1回しか使用できません)。あなたは "name_1"のような何かキーにタグを付けることができます: "Nick"しかし、この解決策はあなたのユースケースではうまくいかないかもしれません。 gabsのgithubのページに、リンクから2つの例を http://github.com/Jeffail/gabs

は、私はあなたに仕立て例をあげると、:あなたは、多次元のルートを移動したい場合は

、このパッケージは、ニーズのために働くこと

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ "first", "second", "third" ]}`)) 

// S is shorthand for Search 
children, _ := jsonParsed.S("array").Children() 
for _, child := range children { 
    fmt.Println(child.Data().(string)) 
} 

と、 - 第一、第二、第三の)ここ

package main 

import (
    "fmt" 
    "github.com/Jeffail/gabs" 
) 

func main() { 

    jsonS := `{ 
     "people": [ 
      { 
       "diffs": [ 
        77 
       ], 
       "original": { 
        "name": "Nick", 
        "active": "Active", 
        "email": "[email protected]" 
       }, 
       "id": "21" 
      } 
     ] 
    }` 

    gabsCon, err := gabs.ParseJSON([]byte(jsonS)) 

    if err != nil { 
     fmt.Println("gabs ParseJSON failed") 
    } 

    n1, ok := gabsCon.Path("people.original.name").Data().(string) 

    if !ok { 
     fmt.Println("gabs path failed") 
    } 

    fmt.Println(n1) 
} 

非調整印刷し、例えば、です他の例 - 1,2,3:

jsonParsed, _ := gabs.ParseJSON([]byte(`{"array":[ {"value":1}, {"value":2}, {"value":3} ]}`)) 

fmt.Println(jsonParsed.Path("array.value").String()) 
関連する問題