2016-11-08 10 views
2

私は昔ながらの方法でJSONに変換する構造体を持っている:マージ2つのJSON文字列

type Output struct { 
    Name  string `json:"name"` 
    Command string `json:"command"` 
    Status int  `json:"status"` 
    Output string `json:"output"` 
    Ttl  int  `json:"ttl,omitempty"` 
    Source string `json:"source,omitempty"` 
    Handlers []string `json:"handlers,omitempty"` 
    } 

sensu_values := &Output{ 
     Name:  name, 
     Command: command, 
     Status: status, 
     Output: output, 
     Ttl:  ttl, 
     Source: source, 
     Handlers: [handlers], 
    } 

私はで何のように定義することができ、ファイルシステムから任意のJSONファイルを読みたいですそのユーザーを元のJSON文字列に追加して、元のものから複製を取り出します。

どうすればいいですか?

+3

は、あなたが何をしたいの詳細とどのような問題が起きていると説明できますか? –

+0

到着したJSONを 'map [string] interface {}'に読み込んで、そのマップを構造体のフィールド名と比較し、一致するものがあれば構造体に代入します。 。受信JSONが任意で、ネストを含めることができる場合は、ネストされたすべてのキーに確実に到達するために再帰アルゴリズムを使用する必要があります。 – evanmcdonnal

+0

私はあなたが示唆しているように、到着したJSONを 'map [string] interface {}'に読んでいましたが、繰り返し部分にはまっていました。 私はmergoライブラリとスタックオーバーフローの答えの束をチェックアウトしましたが、ルビーの背景からくると、ルビーより少し難しいようです:) – jaxxstorm

答えて

2

入力JSON:

{ 
    "environment": "production", 
    "runbook": "http://url", 
    "message": "there is a problem" 
} 

これは、入力JSONを非整列化し、Output構造体をマーシャリング前に2つの構造体を結合する方が良いでしょう。

サンプルコード

inputJSON := `{"environment": "production", "runbook":"http://url","message":"there is a problem"}` 
out := map[string]interface{}{} 
json.Unmarshal([]byte(inputJSON), &out) 

out["name"] = sensu_values.Name 
out["command"] = sensu_values.Command 
out["status"] = sensu_values.Status 

outputJSON, _ := json.Marshal(out) 

Play Link

+0

要件に関しては、https://github.com/jaxxstorm/sensu-wrapperというアプリがあります。これを使用すると、JSON文字列を作成してソケットまたは標準出力に送ることができます。 私は任意のJSONを指定するのは、すべてのユーザーが監視チェックで送信したいフィールドが異なるからです。固定フィールドの場合、それは簡単だと思いますが、任意のJSONとタイピングは難しいようです! – jaxxstorm

+0

質問に任意の入力jsonのサンプルを追加できますか?はい、任意のJSONはGoで処理するのが難しい場合があります。 –

+0

例: '' "environment": "production"、 "runbook": "http:// url"、 "message"、 "問題があります"} ' – jaxxstorm