2016-11-09 3 views
0

以下の形式のjsonデータを構造体にアンマーシャリングする際に問題が発生しています。 jsonの構造は少し混乱しているように見えるので、私はそれを非整列化するためにやっているすべての愚かなことに対して謝ります。Golangが未知のキーでネストされたjsonを非整列化する

{ 
    "message": { 
    "Server1.example.com": [ 
     { 
     "application": "Apache", 
     "host": { 
      "name": "/^Server-[13456]/" 
     }, 
     "owner": "User1", 
     "project": "Web", 
     "subowner": "User2" 
     } 
    ], 
    "Server2.example.com": [ 
     { 
     "application": "Mysql", 
     "host": { 
      "name": "/^Server[23456]/" 
     }, 
     "owner": "User2", 
     "project": "DB", 
     "subowner": "User3" 
     } 
    ] 
    }, 
    "response_ms": 659, 
    "success": true 
} 

次の構造体を使用して非整列化しようとしています。

type ServerDetails struct { 
    Message struct{ 
    Hostname struct{ 
     Details struct{ 
     Application string `json:"application"` 
     }`json:"-"` 
     }`json:"-"` 
    }`json:"message"` 
} 

フィールドServer[0-9].example.comは、ちょうど外に鍵を持っていないサーバー名の後に

 { 
    "application": "Apache", 
    "host": { 
     "name": "/^Server-[13456]/" 
    }, 

その発生の時点では不明となり、変更されており、この分野があります再び私に混乱しているように見えます。どのようにアンマーシャリングすることができるかを理解するために、数多くの組み合わせを試しましたが、失敗しました。

jsonフィールドを構造体に非マーシャル化する作業アプローチは何ですか?誰かが私にこれを理解させるのを助けることができます

ありがとうございます。

+2

さまざまなキーでオブジェクトを非整列化するには、 'map [string] whateverstruct'を使用します。 – Volker

+0

ありがとう@ヴォルカー、あなたは私の日を救った。私はそれに応じて修正し、それは働いた。あなたはそれを答えとして追加できますか?それを受け入れますか? – scott

答えて

3

あなたがマップを含めることができます[文字列を構築するために優れたhttps://mholt.github.io/json-to-go/を使用することができます秒] 後の余分カンマで有効ではありません] ServerStructを使用して要件を満たします。

あなたの構造体は次のようになります。

type YourStruct struct { 
    Success bool 
    ResponseMS int 
    Servers map[string]*ServerStruct 
} 

type ServerStruct struct { 
    Application string 
    Owner string 
    [...] 
} 

をいくつか追加JSONタグでは、あなたのJSONを解析することができるようになります。

0

あなたJSONは、あなたがJSONを修正したら、あなたは以下の移動構造体

type AutoGenerated struct { 
    Message struct { 
     Server1ExampleCom []struct { 
      Application string `json:"application"` 
      Host struct { 
       Name string `json:"name"` 
      } `json:"host"` 
      Owner string `json:"owner"` 
      Project string `json:"project"` 
      Subowner string `json:"subowner"` 
     } `json:"Server1.example.com"` 
     Server2ExampleCom []struct { 
      Application string `json:"application"` 
      Host struct { 
       Name string `json:"name"` 
      } `json:"host"` 
      Owner string `json:"owner"` 
      Project string `json:"project"` 
      Subowner string `json:"subowner"` 
     } `json:"Server2.example.com"` 
    } `json:"message"` 
    ResponseMs int `json:"response_ms"` 
    Success bool `json:"success"` 
} 
+0

申し訳ありませんが、私はjsonをトリミングしたときに昏睡状態が無効でした。私はそれを訂正します。しかし、jsonは生成時に知られていない可変キーを持っているので、server1.example.comを構造体にハードコードすることはできません。それは変わることがあります。 – scott

+0

あなたは正しいです。このツールは、JSON形式が事前にわかっている場合にはまだ素晴らしいツールです。 –

+0

はい、同意します。そのような便利なツールを提案するための+1 :-) – scott

関連する問題