2017-08-19 8 views
-1

私は次のjsonをアンマーシャリングする醜い方法を持っていますが、多くの手作業が必要です。私はいくつかのチームが元々存在していたことが分かっていないと、さまざまなチーム名を取得するためのプログラム的な方法を探しています。それは真に私が遭遇した最も不十分な構造化APIの1つです。ゴールウェイの深く入れ子にされたjson

data := []byte(`{ 
    "fantasy_content": { 
     "copyright": "Data provided by Yahoo! and STATS, LLC", 
     "league": [ 
      { 
       "allow_add_to_dl_extra_pos": 0, 
       "current_week": "1", 
       "draft_status": "predraft", 
       "edit_key": "1", 
       "end_date": "2017-12-25", 
       "end_week": "16", 
       "game_code": "nfl", 
       "is_cash_league": "0", 
       "is_pro_league": "0", 
       "league_id": "XXXXX", 
       "league_key": "XXXX", 
       "league_type": "private", 
       "league_update_timestamp": null, 
       "name": "XXXXXX", 
       "num_teams": 14, 
       "renew": "XXXX", 
       "renewed": "", 
       "scoring_type": "head", 
       "season": "2017", 
       "short_invitation_url": "XXXXX", 
       "start_date": "2017-09-07", 
       "start_week": "1", 
       "url": "XXXXXX", 
       "weekly_deadline": "" 
      }, 
      { 
       "teams": { 
        "0": { 
         "team": [ 
          [ 
           { 
            "team_key": "XXXX" 
           }, 
           { 
            "team_id": "1" 
           }, 
           { 
            "name": "XXXXX" 
           }, 
           [], 
           { 
            "url": "XXXXX" 
           }, 
           { 
            "team_logos": [ 
             { 
              "team_logo": { 
               "size": "large", 
               "XXX" 
              } 
             } 
            ] 
           }, 
           [], 
           { 
            "waiver_priority": "" 
           }, 
           { 
            "faab_balance": "100" 
           }, 
           { 
            "number_of_moves": 0 
           }, 
           { 
            "number_of_trades": 0 
           }, 
           { 
            "roster_adds": { 
             "coverage_type": "week", 
             "coverage_value": "1", 
             "value": "0" 
            } 
           }, 
           [], 
           { 
            "league_scoring_type": "head" 
           }, 
           [], 
           [], 
           { 
            "has_draft_grade": 0 
           }, 
           [], 
           [], 
           { 
            "managers": [ 
             { 
              "manager": { 
               "email": "XXXXX", 
               "guid": "XX", 
               "image_url": "https://s.yimg.com/wm/modern/images/default_user_profile_pic_64.png", 
               "is_commissioner": "1", 
               "manager_id": "1", 
               "nickname": "Andrew" 
              } 
             } 
            ] 
           } 
          ] 
         ] 
        }, 
        "1": { 
         "team": [ 
          [ 
           { 
            "team_key": "XXXXX" 
           }, 
           { 
            "team_id": "2" 
           }, 
           { 
            "name": "XXXXX" 
           }, 
           [], 
           { 
            "url": "XXXXX" 
           }, 
           { 
            "team_logos": [ 
             { 
              "team_logo": { 
               "size": "large", 
               "url": "XXXX" 
              } 
             } 
            ] 
           }, 
           [], 
           { 
            "waiver_priority": "" 
           }, 
           { 
            "faab_balance": "100" 
           }, 
           { 
            "number_of_moves": 0 
           }, 
           { 
            "number_of_trades": 0 
           }, 
           { 
            "roster_adds": { 
             "coverage_type": "week", 
             "coverage_value": "1", 
             "value": "0" 
            } 
           }, 
           [], 
           { 
            "league_scoring_type": "head" 
           }, 
           [], 
           [], 
           { 
            "has_draft_grade": 0 
           }, 
           [], 
           [], 
           { 
            "managers": [ 
             { 
              "manager": { 
               "email": "[email protected]", 
               "guid": "XXXX", 
               "image_url": "https://s.yimg.com/wm/modern/images/default_user_profile_pic_64.png", 
               "manager_id": "2", 
               "nickname": "Andrew" 
              } 
             }, 
             { 
              "manager": { 
               "email": "[email protected]", 
               "guid": "XX", 
               "image_url": "https://s.yimg.com/wm/modern/images/default_user_profile_pic_64.png", 
               "is_comanager": "1", 
               "manager_id": "15", 
               "nickname": "XX" 
              } 
             } 
            ] 
           } 
          ] 
         ] 
        }, 
        "10": { 
         "team": [ 
          [ 
           { 
            "team_key": "XXX" 
           }, 
           { 
            "team_id": "11" 
           }, 
           { 
            "name": "XXX" 
           }, 
           [], 
           { 
            "url": "https://football.fantasysports.yahoo.com/f1/XXX" 
           }, 
           { 
            "team_logos": [ 
             { 
              "team_logo": { 
               "size": "large", 
               "url": "https://s.yimg.com/dh/ap/fantasy/nfl/img/icon_01_100.png" 
              } 
             } 
            ] 
           }, 
           [], 
           { 
            "waiver_priority": "" 
           }, 
           { 
            "faab_balance": "100" 
           }, 
           { 
            "number_of_moves": 0 
           }, 
           { 
            "number_of_trades": 0 
           }, 
           { 
            "roster_adds": { 
             "coverage_type": "week", 
             "coverage_value": "1", 
             "value": "0" 
            } 
           }, 
           [], 
           { 
            "league_scoring_type": "head" 
           }, 
           [], 
           [], 
           { 
            "has_draft_grade": 0 
           }, 
           [], 
           [], 
           { 
            "managers": [ 
             { 
              "manager": { 
               "email": "[email protected]", 
               "guid": "XX", 
               "image_url": "https://s.yimg.com/wm/modern/images/default_user_profile_pic_64.png", 
               "manager_id": "11", 
               "nickname": "XX" 
              } 
             } 
            ] 
           } 
          ] 
         ] 
        }, 
        "2": { 
         "team": [ 
          [ 
           { 
            "team_key": "371.l.102542.t.3" 
           }, 
           { 
            "team_id": "3" 
           }, 
           { 
            "name": "XXX" 
           }, 
           [], 
           { 
            "url": "https://football.fantasysports.yahoo.com/f1/XX/3" 
           }, 
           { 
            "team_logos": [ 
             { 
              "team_logo": { 
               "size": "large", 
               "url": "https://ct.yimg.com/cy/5603/30147468023_1c705edb29_192sq.jpg?ct=fantasy" 
              } 
             } 
            ] 
           }, 
           [], 
           { 
            "waiver_priority": "" 
           }, 
           { 
            "faab_balance": "100" 
           }, 
           { 
            "number_of_moves": 0 
           }, 
           { 
            "number_of_trades": 0 
           }, 
           { 
            "roster_adds": { 
             "coverage_type": "week", 
             "coverage_value": "1", 
             "value": "0" 
            } 
           }, 
           [], 
           { 
            "league_scoring_type": "head" 
           }, 
           [], 
           [], 
           { 
            "has_draft_grade": 0 
           }, 
           [], 
           [], 
           { 
            "managers": [ 
             { 
              "manager": { 
               "email": "XXXgmail.com", 
               "guid": "XXXX", 
               "image_url": "https://s.yimg.com/wv/images/6c93ed606f742d4c075bc091633cc072_64.jpg", 
               "manager_id": "3", 
               "nickname": "XX" 
              } 
             } 
            ] 
           } 
          ] 
         ] 
        }, 
        "3": { 
         "team": [ 
          [ 
           { 
            "team_key": "371.l.102542.t.4" 
           }, 
           { 
            "team_id": "4" 
           }, 
           { 
            "name": "XX" 
           }, 
           [], 
           { 
            "url": "https://football.fantasysports.yahoo.com/f1/XX/4" 
           }, 
           { 
            "team_logos": [ 
             { 
              "team_logo": { 
               "size": "large", 
               "url": "https://s.yimg.com/dh/ap/fantasy/nfl/img/icon_10_100.png" 
              } 
             } 
            ] 
           }, 
           [], 
           { 
            "waiver_priority": "" 
           }, 
           { 
            "faab_balance": "100" 
           }, 
           { 
            "number_of_moves": 0 
           }, 
           { 
            "number_of_trades": 0 
           }, 
           { 
            "roster_adds": { 
             "coverage_type": "week", 
             "coverage_value": "1", 
             "value": "0" 
            } 
           }, 
           [], 
           { 
            "league_scoring_type": "head" 
           }, 
           [], 
           [], 
           { 
            "has_draft_grade": 0 
           }, 
           [], 
           [], 
           { 
            "managers": [ 
             { 
              "manager": { 
               "email": "[email protected]", 
               "guid": "XX", 
               "image_url": "https://s.yimg.com/wm/modern/images/default_user_profile_pic_64.png", 
               "manager_id": "4", 
               "nickname": "XX" 
              } 
             } 
            ] 
           } 
          ] 
         ] 
        }, 
        "8": { 
         "team": [ 
          [ 
           { 
            "team_key": "XXX" 
           }, 
           { 
            "team_id": "9" 
           }, 
           { 
            "name": "XxX" 
           }, 
           [], 
           { 
            "url": "https://football.fantasysports.yahoo.com/f1/XX/9" 
           }, 
           { 
            "team_logos": [ 
             { 
              "team_logo": { 
               "size": "large", 
               "url": "https://ct.yimg.com/cy/8393/28682944304_33bda49603_192sq.jpg?ct=fantasy" 
              } 
             } 
            ] 
           }, 
           [], 
           { 
            "waiver_priority": "" 
           }, 
           { 
            "faab_balance": "100" 
           }, 
           { 
            "number_of_moves": 0 
           }, 
           { 
            "number_of_trades": 0 
           }, 
           { 
            "roster_adds": { 
             "coverage_type": "week", 
             "coverage_value": "1", 
             "value": "0" 
            } 
           }, 
           [], 
           { 
            "league_scoring_type": "head" 
           }, 
           [], 
           [], 
           { 
            "has_draft_grade": 0 
           }, 
           [], 
           [], 
           { 
            "managers": [ 
             { 
              "manager": { 
               "email": "XXX", 
               "guid": "XXX", 
               "image_url": "https://s.yimg.com/wm/modern/images/default_user_profile_pic_64.png", 
               "manager_id": "9", 
               "nickname": "XXX" 
              } 
             } 
            ] 
           } 
          ] 
         ] 
        }, 
        "count": 14 
       } 
      } 
     ], 
     "refresh_rate": "60", 
     "time": "110.55207252502ms", 
     "xml:lang": "en-US", 
     "yahoo:uri": "/fantasy/v2/league/XXXX/teams" 
    } 
}`) 

以下の作品が、それは面倒だと私はそのチームのためにデータを取得するには、ハードコードにチームごとに異なる構造体の値を持っています。

type TeamApi_ struct { 
    TeamKey string `json:"team_key"` 
    TeamId string `json:"team_id"` 
    Name string `json:"name"` 
} 

type LeaguesApi struct { 
    NumTeams int `json:"num_teams"` 
    TeamsApi struct { 
     Zero struct { 
      TeamsApi_ [][]TeamApi_ `json:"team"` 
     } `json:"0"` 
     One struct { 
      TeamsApi_ [][]TeamApi_ `json:"team"` 
     } `json:"1"` 
     Two struct { 
      TeamsApi_ [][]TeamApi_ `json:"team"` 
     } `json:"2"` 
     Three struct { 
      TeamsApi_ [][]TeamApi_ `json:"team"` 
     } `json:"3"` 
    } `json:"teams"` 
} 

type LeagueApiResult struct { 
FantasyContent struct { 
      LeagueApi []LeaguesApi `json:"league"` 

    } `json:"fantasy_content"` 
} 

var Result LeagueApiResult 
err := json.Unmarshal(data, &Result) 
if err != nil { 
    fmt.Println(err) 
} 


fmt.Println(Result.FantasyContent.LeagueApi[1].TeamsApi.One.TeamsApi_[0][2].Name) 
+0

サードパーティjsonをアンマーシャリングする必要がある場合はジェネレータを使用してください。[example generator](https://mholt.github.io/json-to-go/) –

+0

これは便利ですが完全には役立ちません。私はまだTeamsApi構造体で終わります。各構造体の名前はstruct(Zero、One、Two)です。私はどうにかしてTeamsApi構造体をプログラム的に反復して、これらの要素をそれぞれ独自の変数として取得する必要があります。 – Ceej

答えて

0

おそらく、カスタムJSONアンマーシャラーを使用してください。データはteams部分の両方含むチームやcountフィールドで、それは道を構造化されているので、あなたが手動ロジックの公平なビットをおそらく必要がありますhttp://choly.ca/post/go-json-marshalling/

:あなたはここにいずれかを使用する方法の例を見ることができますそこで。

まず、あなたはLeagueを定義することによって開始することができます:

type League struct { 
    AllowAddToDlExtraPos int     `json:"allow_add_to_dl_extra_pos,omitempty"` 
    CurrentWeek   string     `json:"current_week,omitempty"` 
    DraftStatus   string     `json:"draft_status,omitempty"` 
    EditKey    string     `json:"edit_key,omitempty"` 
    EndDate    string     `json:"end_date,omitempty"` 
    EndWeek    string     `json:"end_week,omitempty"` 
    GameCode    string     `json:"game_code,omitempty"` 
    IsCashLeague   string     `json:"is_cash_league,omitempty"` 
    IsProLeague   string     `json:"is_pro_league,omitempty"` 
    LeagueID    string     `json:"league_id,omitempty"` 
    LeagueKey    string     `json:"league_key,omitempty"` 
    LeagueType   string     `json:"league_type,omitempty"` 
    LeagueUpdateTimestamp interface{}   `json:"league_update_timestamp,omitempty"` 
    Name     string     `json:"name,omitempty"` 
    NumTeams    int     `json:"num_teams,omitempty"` 
    Renew     string     `json:"renew,omitempty"` 
    Renewed    string     `json:"renewed,omitempty"` 
    ScoringType   string     `json:"scoring_type,omitempty"` 
    Season    string     `json:"season,omitempty"` 
    ShortInvitationURL string     `json:"short_invitation_url,omitempty"` 
    StartDate    string     `json:"start_date,omitempty"` 
    StartWeek    string     `json:"start_week,omitempty"` 
    URL     string     `json:"url,omitempty"` 
    WeeklyDeadline  string     `json:"weekly_deadline,omitempty"` 
    Teams     []Team     `json:"-"` 
} 

次に、我々はTeam構造に我々はそれが見てみたい方法を定義することができます。

type Team struct { 
    // Declare the fields of a Team 
} 

そして最後に、我々はLeagueのカスタムアンマーシャリング関数を宣言。それはLeagueApiResult内のリーグ構造に当たったとき

func (l *League) UnmarshalJSON(data []byte) error { 
    type Alias League 
    aux := &struct { 
     *Alias 
     Teams map[string]interface{} `json:"teams"` 
    }{ 
     Alias: (*Alias)(l), 
    } 

    if err := json.Unmarshal(data, aux); err != nil { 
     return err 
    } 

    var teams []Team 
    for num, team := range aux.Teams { 
     // Add your code to parse each of the teams from the 
     // map you declared above. 
    } 
    l.Teams = teams 

    return nil 
} 

アンマーシャリング機能は自動的にGolangsのJSONライブラリによって呼び出されます。

関連する問題