jjzjj

json - 在 golang 中解码深度嵌套的 json

coder 2023-07-01 原文

我有一种丑陋的方式来解码以下 json,但它需要大量的手动工作。如果我不知道最初到底有多少支球队,我正在寻找一种更具编程性的方式来获取各种球队名称。它确实是我遇到过的结构最差的 api 之一。

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": "XXXX@yahoo.com",
                                                "guid": "XXXX",
                                                "image_url": "https://s.yimg.com/wm/modern/images/default_user_profile_pic_64.png",
                                                "manager_id": "2",
                                                "nickname": "Andrew"
                                            }
                                        },
                                        {
                                            "manager": {
                                                "email": "XXX@yahoo.com",
                                                "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": "XXX@gmail.com",
                                                "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": "XXX@yahoo.com",
                                                "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)

最佳答案

您可能想为此使用自定义 JSON 解码器。您可以在此处查看如何使用的示例:http://choly.ca/post/go-json-marshalling/

由于数据的结构是这样的,teams 部分同时包含团队和 count 字段,您可能需要一些手动逻辑在那里。

首先,您可以从定义联盟开始:

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 声明一个自定义解码函数。

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
}

当 Golang 的 json 库命中 LeagueApiResult 中的 League 结构时,会自动调用 unmarshal 函数。

关于json - 在 golang 中解码深度嵌套的 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45774425/

有关json - 在 golang 中解码深度嵌套的 json的更多相关文章

  1. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  2. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. Ruby——嵌套类和子类是一回事吗? - 2

    下面例子中的Nested和Child有什么区别?是否只是同一事物的不同语法?classParentclassNested...endendclassChild 最佳答案 不,它们是不同的。嵌套:Computer之外的“Processor”类只能作为Computer::Processor访问。嵌套为内部类(namespace)提供上下文。对于ruby​​解释器Computer和Computer::Processor只是两个独立的类。classComputerclassProcessor#Tocreateanobjectforthisc

  5. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  6. ruby-on-rails - 使用回形针的嵌套形式 - 2

    我有一个名为posts的模型,它有很多附件。附件模型使用回形针。我制作了一个用于创建附件的独立模型,效果很好,这是此处说明的View(https://github.com/thoughtbot/paperclip):@attachment,:html=>{:multipart=>true}do|form|%>posts中的嵌套表单如下所示:prohibitedthispostfrombeingsaved:@attachment,:html=>{:multipart=>true}do|at_form|%>附件记录已创建,但它是空的。文件未上传。同时,帖子已成功创建...有什么想法吗?

  7. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  8. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  9. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  10. ruby - 用 YAML.load 解析 json 安全吗? - 2

    我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("

随机推荐