doudao9915 2015-12-28 08:12
浏览 121
已采纳

转到:解组JSON嵌套的对象数组

I'm aware that you can unmarshal arbitrary JSON into a map[string]interface{} value, and while that works, my JSON response is always defined and consistent, and for simplicity's sake, I'd prefer to unmarshal it as nested structs.

Here's a sample of the JSON response, abbreviated:

{
  (...)
  "results": [
    {
      "section": "N.Y. / Region",
      "subsection": "",
      "title": "Christie Spins His Version of Security Record on Trail",
      "abstract": "An examination of Gov. Chris Christie’s record as New Jersey’s top federal prosecutor shows that he has, at times, overstated the significance of the terrorism prosecutions he oversaw.",
      "url": "http://www.nytimes.com/2015/12/27/nyregion/Christie-markets-himself-as-protector-to-gain-in-polls.html",
      "byline": "By ALEXANDER BURNS and CHARLIE SAVAGE",
      "item_type": "Article",
      "updated_date": "2015-12-26T18:04:19-5:00",
      (...)
      "multimedia": [
        {
          "url": "http://static01.nyt.com/images/2015/12/27/nyregion/27CHRISTIE1/27CHRISTIE1-thumbStandard.jpg",
          "format": "Standard Thumbnail",
          "height": 75,
          "width": 75,
          "type": "image",
          "subtype": "photo",
          "caption": "Gov. Chris Christie of New Jersey spoke about the Sept. 11, 2001, attacks at a Republican conference last month.",
          "copyright": "Stephen Crowley/The New York Times"
        }
        (...)
      ]
    }
  ]
}

What I've tried

I tried using JSONutils to automate the struct creation and ended up with this (after deleting the fields I didn't want):

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

type PoliticsJson struct {
    Results []struct {
        Multimedia []struct {
            URL string `json:"url"`
        } `json:"multimedia"`
        Title string `json:"title"`
    } `json:"results"`
}

func retrieveData() []byte {
    url := "http://api.nytimes.com/svc/topstories/v1/politics.json?MYAPIKEY"
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    defer resp.Body.Close()
    body, err2 := ioutil.ReadAll(resp.Body)
    if err2 != nil {
        fmt.Println(err2)
    }
    return body
}


func main() {
    var p PoliticsJson

    err := json.Unmarshal(retrieveData(), &p)
    if err != nil {
        panic(err)
    }
    fmt.Println(p.Results[0].Title)
}

I basically just want to print out the title and the URL of the last object in the multimedia array. (I'm just trying to get it to work, so please pardon the error handling.)

Here's the error I get: panic: json: cannot unmarshal string into Go value of type []struct { URL string "json:\"url\"" }

The problem is with the Multimedia struct, apparently. What's confusing me is that this error seems to suggest that it's being interpreted as a string, but I changed the struct to this to make sure:

type PoliticsJson struct {
    Results []struct {
        Multimedia string `json:"multimedia"`
        Title      string `json:"title"`
    } `json:"results"`
}

And I got panic: json: cannot unmarshal array into Go value of type string, which suggests it is being interpreted as an array in the JSON.

Again, I basically just want to print out the title and the URL of the last object in the multimedia array.

  • 写回答

1条回答 默认 最新

  • duanpo6079 2015-12-28 09:22
    关注

    Tried using your PoliticsJson and Sample Json string was able to parse to get Title and URL.

    I tried adding one more entry for multi media by changing URL to static02 and able to get both the URL's printed.

    Here is the link to PlayGround for the same: http://play.golang.org/p/rAJfkD1i7n

    Edit

    Found the issue, it happening because, in 2 of the results multimedia is string i.e. "multimedia":"" check line 975 and 1319. Since array is expected, json is failing because string is found convert this to "multimedia":[].

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥88 用uniapp写一个多端的程序,用到高德地图,用高德的JSAPI吗?
  • ¥20 关于#c++#的问题:水果店管理系统
  • ¥30 dbLinq最新版linq sqlite
  • ¥20 对D盘进行分盘之前没有将visual studio2022卸载掉,现在该如何下载回来
  • ¥15 完成虚拟机环境配置,还有安装kettle
  • ¥15 2024年全国大学生数据分析大赛A题:直播带货与电商产品的大数据分析 问题5. 请设计一份优惠券的投放策略,需要考虑优惠券的数量、优惠券的金额、投放时间段和投放商品种类等因素。求具体的python代码
  • ¥15 有人会搭建生鲜配送自营+平台的管理系统吗
  • ¥15 用matlab写代码
  • ¥30 motoradmin系统的多对多配置
  • ¥15 求组态王串口自定义通信配置方法或代码?