2017-06-08 10 views
0

文書には目的に応じて最小のキーと値のペアのメタデータがあります。人々のリストには、"name":"joe"のようなものがあるかもしれないし、joeの鍵を持つこともできる。キーが少なくなってしまいます。この簡潔なJSONドキュメントのGo構造体は何でしょうか?

おそらく、このドキュメントはGo構造体にとってはあまりにも動的ですか?私もYAMLを試してみましたが、これは構造体の問題です。構造体が正しくマッピングされていないため、構造体は空のままです。

遊び場リンク:https://play.golang.org/p/PGSjoKvNja

それとも私は自分UnmarshalJSONをロールと条件(またはスイッチ)「アクション」のために持っている必要がありますか?もしそうなら大丈夫です。私はそこで強制と妥当性検査を行い、文書をループして、問題のある汎用アクションビットが存在することを検出し、正しいタイプの構造体を作成します。

+2

構造体は強く型付けされているため、構造体に非整列化するには、データの一貫性が必要です。データが一貫していない場合は、マップに整列解除する方がよい場合があります。 – Adrian

+1

私はこれをかなり柔軟にして、HCLとmapstructureを見ていました。これらがもっと必要なものなのかどうかはまだ分かりません。この例の 'Extra'フィールドをチェックしてください:https://godoc.org/github.com/mitchellh/mapstructure#example-Decode – squarism

答えて

1

データがでない場合は、と一致しています。@Adrianが述べているように、あなたは私が示しているもののために行ってはいけません。

そうでない場合は、次の構造体を使用して文字列を非整列化することができるはず、json-to-goでJSON

type Custom struct { 
    Ball []struct { 
     Throw struct { 
      Strength string `json:"strength"` 
     } `json:"throw"` 
    } `json:"ball"` 
    Frisbee []struct { 
     Fling struct { 
      Curve string `json:"curve"` 
     } `json:"fling"` 
     Catch struct { 
      Trick string `json:"trick"` 
      Jump string `json:"jump"` 
     } `json:"catch"` 
    } `json:"frisbee"` 
} 

そして

func main() { 

    var c Custom 
    err := json.Unmarshal([]byte(input), &c) 
    if err != nil { 
     panic(err) 
    } 

    fmt.Println(input) 

} 

のうち、構造体を得るために非常に便利なツールを生成どのプリントアウト

{ 
    "ball": [{ 
     "throw": { 
      "strength": "60%" 
     } 
    }, { 
     "throw": { 
      "strength": "20%" 
     } 
    }], 
    "frisbee": [{ 
     "fling": { 
      "curve": "left" 
     } 
    }, { 
     "catch": { 
      "trick": "behind back", 
      "jump": "sure" 
     } 
    }] 
} 

をご覧ください私はセットアップしました。

1

それは次のようになります。

type AutoGenerated struct { 
    Ball []struct { 
     Throw struct { 
      Strength string `json:"strength"` 
     } `json:"throw"` 
    } `json:"ball"` 
    Frisbee []struct { 
     Fling struct { 
      Curve string `json:"curve"` 
     } `json:"fling,omitempty"` 
     Catch struct { 
      Trick string `json:"trick"` 
      Jump string `json:"jump"` 
     } `json:"catch,omitempty"` 
    } `json:"frisbee"` 
} 

あなたは、各インライン構造体定義のための別のタイプを定義することができますofcourseの。上記のデータ構造を生成するために使用されるthisオンラインツールを使用することができます。

+0

ええ、これ以上のタイプはhttps://play.golang.org/p/です。 ZET8YE_ihXしかし、私はどこにでもnilsを持っています。私は私が推測するクリーンアップパスを行うことができますか?私自身のJSONスキーマはこの場合かなり悪いと思います。 Rubyでは、ハッシュの型についてRubyが気にしないため、Rubyで動作します。それだけでそれを行います。だから、私のスキーマの習慣があまりにもダイナミックであるか何かです。私は私のために働くmapstructure pkgを得ることができることを願っています。 – squarism

+0

さて、私は、言語そのものではなく、ワークフローとツール(バイナリデプロイメント、gofmtによるコーディングスタイルの一貫性など)を使用します。 Goは、言語のデザインや表現力を突破口として宣伝されることはありません。地域社会で推進されているベストプラクティスとは対照的に、私は多くのリフレクションなどを使用しています。 'map [string] interface {}'に加えて、 'json.RawMessage'のような' json'パッケージ内のいくつかのビットと、ハンドリングに役立つ2つのインターフェース( 'json.Marshaler'と' json.Unmarshaler')ダイナミックな状況。 –

+0

参考リンク: https://golang.org/pkg/encoding/json/#RawMessage https://golang.org/pkg/encoding/json/#Marshaler ます。https:// golang。org/pkg/encoding/json /#Unmarshaler –

関連する問題