为了账号安全,请及时绑定邮箱和手机立即绑定

检索嵌套 Json 数组的第一条记录

检索嵌套 Json 数组的第一条记录

Go
慕桂英3389331 2021-08-23 15:43:47
我正在尝试解析嵌入式 JSON 数组中的第一条记录,并基于这些属性的子集创建一个对象。我有这个工作,但基于这个问题,我不得不认为有一种更优雅/更不脆弱的方式来做到这一点。有关更多背景信息,这是调用musicbrainz JSON Web 服务的结果集,我将第一条artists记录视为我正在寻找的艺术家。JSON 的格式是这样的:{    "created": "2014-10-08T23:55:54.343Z",    "count": 458,    "offset": 0,    "artists": [{        "id": "83b9cbe7-9857-49e2-ab8e-b57b01038103",        "type": "Group",        "score": "100",        "name": "Pearl Jam",        "sort-name": "Pearl Jam",        "country": "US",        "area": {            "id": "489ce91b-6658-3307-9877-795b68554c98",            "name": "United States",            "sort-name": "United States"        },        "begin-area": {            "id": "10adc6b5-63bf-4b4e-993e-ed83b05c22fc",            "name": "Seattle",            "sort-name": "Seattle"        },        "life-span": {            "begin": "1990",            "ended": null        },        "aliases": [],        "tags": []    },    ...}这是我到目前为止的代码。我希望能够使用我的ArtistCollection类型来解决一些问题interface{},但我不知道如何使用。我也不想费心映射艺术家记录的所有属性,我只对"name"和"id"值感兴趣。package mainimport (    "fmt"    "encoding/json"    )type Artist struct {    Id string    Name string}type ArtistCollection struct {    Artists []Artist}func main() {    raw := //json formatted byte array    var topLevel interface{}    err := json.Unmarshal(raw, &topLevel)    if err != nil {        fmt.Println("Uh oh")    } else {        m := topLevel.(map[string]interface{})        //this seems really hacky/brittle, there has to be a better way?        result := (m["artists"].([]interface{})[0]).(map[string]interface{})        artist := new(Artist)        artist.Id = result["id"].(string)        artist.Name = result["name"].(string)        fmt.Println(artist)    }}
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

定义与 JSON 结构匹配的类型并解组为该类型的值。我在下面使用匿名类型。使用长度为 1 的数组来获取第一条艺术家记录:


package main


import (

    "encoding/json"

    "fmt"

)


type Artist struct {

    Id   string

    Name string

}


func main() {

    raw := // JSON formatted byte array

    var result struct {

        Artists artist

    }

    err := json.Unmarshal(raw, &result)

    if err != nil {

        fmt.Println(err)

        return

    }

    fmt.Printf("%#v\n", result.Artists[0])

}


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信