2017-08-11 23 views
0

私はプロジェクトに取り組んでいます。私は初めてGoを使用しています。GoでAPIから読み込む構造体を作成する

このプロジェクトでは多くのAPIがクエリされていますが、ほとんどの場合、問題なく動作しています。

PHPバックグラウンドから来ているので、JSON応答のGo型定義を作成するのは少し異なります。

私はそうのようなJSONレスポンスを返す1つのAPI、MagentoのAPI、上で立ち往生しています:私はしかし、それはdoesnの、私はstructタイプの作成を支援するために、JSON-to-Go、ツールを使用している

{ 
    "66937": { 
     "entity_id": "66937", 
     "website_id": "1", 
     "email": "[email protected]", 
     "group_id": "1", 
     "created_at": "2017-08-11 02:09:18", 
     "disable_auto_group_change": "0", 
     "firstname": "Joe", 
     "lastname": "Bloggs", 
     "created_in": "New Zealand Store View" 
    }, 
    "66938": { 
     "entity_id": "66938", 
     "website_id": "1", 
     "email": "[email protected]", 
     "group_id": "1", 
     "created_at": "2017-08-11 02:16:41", 
     "disable_auto_group_change": "0", 
     "firstname": "Jane", 
     "lastname": "Doe", 
     "created_in": "New Zealand Store View" 
    } 
} 

実際に顧客と関係するもの - 私が興味を持ってすべてが内部JSONで

type AutoGenerated struct { 
    Num0 struct { 
     EntityID    string `json:"entity_id"` 
     WebsiteID    string `json:"website_id"` 
     Email     string `json:"email"` 
     GroupID    string `json:"group_id"` 
     CreatedAt    string `json:"created_at"` 
     DisableAutoGroupChange string `json:"disable_auto_group_change"` 
     Firstname    string `json:"firstname"` 
     Lastname    string `json:"lastname"` 
     CreatedIn    string `json:"created_in"` 
    } `json:"0"` 
    Num1 struct { 
     EntityID    string `json:"entity_id"` 
     WebsiteID    string `json:"website_id"` 
     Email     string `json:"email"` 
     GroupID    string `json:"group_id"` 
     CreatedAt    string `json:"created_at"` 
     DisableAutoGroupChange string `json:"disable_auto_group_change"` 
     Firstname    string `json:"firstname"` 
     Lastname    string `json:"lastname"` 
     CreatedIn    string `json:"created_in"` 
    } `json:"1"` 
} 

「tは応答のこのスタイルのためにかなり右に見えます。私はいくつかの情報を抽出するためにこれを繰り返しています。

これを読むには、どのようにしてstructを作成する必要がありますか?

私はいくつかのドキュメントや記事を見てきましたが、より単純なJSONレスポンスを例として使用する傾向があります。

答えて

1

あなたのJSON構造がうまくいくかもしれません。

プレイリンク:https://play.golang.org/p/ygXsdYALCb

あなたが好きなようにあなたのフィールド名をカスタマイズも好むInfoまたは名前と呼ばれるstructを作成します。

type Info struct { 
    EntityID    string `json:"entity_id"` 
    WebsiteID    string `json:"website_id"` 
    Email     string `json:"email"` 
    GroupID    string `json:"group_id"` 
    CreatedAt    string `json:"created_at"` 
    DisableAutoGroupChange string `json:"disable_auto_group_change"` 
    Firstname    string `json:"firstname"` 
    Lastname    string `json:"lastname"` 
    CreatedIn    string `json:"created_in"` 
} 

そしてInfo構造体及びそのアンマーシャリングのmapを作成します。

var result map[string]Info 
if err := json.Unmarshal(jsonBytes, &result); err != nil { 
    fmt.Println(err) 
} 
fmt.Printf("%+v", result) 

EDIT:

コメントに尋ねたとして、for例追加:まあ

fmt.Println("Accessing unmarshal values:") 
for key, info := range result { 
    fmt.Println("Key:", key) 
    fmt.Printf("Complete Object: %+v\n", info) 
    fmt.Println("Individual value, typical object field access:") 
    fmt.Println("EntityID:", info.EntityID) 
    fmt.Println("Email:", info.Email) 
} 
+0

@Jamesがループの詳細を解答に追加しました。見てください。 – jeevatkm

2

を、最初に、私は自動生成された構造体の定義を好きではありませんそこ。私はそれはあなたが提供しましたあなたのJSONで動作するはずラッパー型

type Customers map[string]Customer 

これを作成することも、この

type Customer struct { 
    EntityID    string `json:"entity_id"` 
    WebsiteID    string `json:"website_id"` 
    Email     string `json:"email"` 
    GroupID    string `json:"group_id"` 
    CreatedAt    string `json:"created_at"` 
    DisableAutoGroupChange string `json:"disable_auto_group_change"` 
    Firstname    string `json:"firstname"` 
    Lastname    string `json:"lastname"` 
    CreatedIn    string `json:"created_in"` 
} 

に見えるように変更します。これをまとめるには

customers := Customers{} 
err := json.Unmarshal(jsonBytes, &customers) 
0

@Xibzと@jeevatkmの両方が素晴らしいソリューションを提供しました。しかし、場合によっては、すべてのJSON構造を非構造化してGo構造にすることはできません。独自のデコード機能を定義する必要があるかもしれません。

特定のデータタイプまたは構造に対して独自のデコード機能を定義する必要がある場合は、gorillaのスキーマパッケージを試すこともできます。

https://github.com/gorilla/schema

関連する問題