登录
首页 >  Golang >  Go问答

使用JSON Unmarshal解析循环中的数据

来源:stackoverflow

时间:2024-03-22 14:36:33 288浏览 收藏

在 Go 中使用 `json.Unmarshal` 解析 JSON 数据时,对于循环中多次使用的情况需要注意。代码中使用指针变量 `welcome` 来存储解析结果,但错误地使用了 `&welcome` 传递了指针的指针。正确的做法是直接传递指针 `welcome`,以避免覆盖原始数据。此外,解析时需要使用 `json.Unmarshal`(大写 U)而不是 `json.unmarshal`(小写 u)。

问题内容

我是 go 新手,我的代码在 for 循环中多次使用 json.unmarshal 时遇到问题。

在此代码中,前两个函数从 url 获取响应,将其转换为字节格式,然后将其解组为数据。最终函数迭代 url 列表,并依次解组它们,每次都附加一个包含一组航班代码的数组。

使用我在这里使用的结构集,我可以将 getflightdata 用于单个 url,它将打印一组航班代码。然而,当在 for 循环中尝试相同的操作时,数组 flightstosunnycities 将打印一组内部有空格的方括号。在 for 循环迭代时打印 thisnumber 也会类似地打印空白区域。

var data scheduledflight

func unmarshalbodytopointerflight(body []byte, welcome *scheduledflight) {
    err2 := json.unmarshal(body, &welcome)
    if err2 != nil {
        fmt.println(err2)
        os.exit(1)
    }
}

func getflightdata(url string) *scheduledflight {
    res := fetchresponse(url)
    body := responsebodytobyte(res)
    unmarshalbodytopointerflight(body, &data)
    return &data
}

func unmarshalflightstatsurl() []string {
    urllist := listofurl()
    var flightstosunnycities []string
    for _, item := range urllist {

        var flightstats *scheduledflight = getflightdata(item)
        var thisnumber string = flightstats.flightnumber
        flightstosunnycities = append(flightstosunnycities, thisnumber)

    }
    fmt.println(flightstosunnycities)
    return flightstosunnycities
}

我正在使用的结构如下所示:

type Welcome struct {
    ScheduledFlights []ScheduledFlight `json:"scheduledFlights"`
}

type ScheduledFlight struct {
    CarrierFSCode          string `json:"carrierFsCode"`
    FlightNumber           string `json:"flightNumber"`
    DepartureAirportFSCode string `json:"departureAirportFsCode"`
    ArrivalAirportFSCode   string `json:"arrivalAirportFsCode"`
}

我怀疑这个问题是由于 scheduledflights 类型为 []scheduledflight 引起的,需要对此进行说明,但是我不知道解决方案是什么。如果有人有任何建议,我们将不胜感激,谢谢。


解决方案


下面解组 json 输入的方式是错误的:

func unmarshalbodytopointerflight(body []byte, welcome *scheduledflight){
err2 := json.unmarshal(body, &welcome)

函数 unmarshalbodytopointerflight 获取一个指针 scheduledflight,并且您希望将数据解组到该指针指向的位置。为此,您必须调用:

err2 := json.Unmarshal(Body, welcome)

您执行此操作的方式是覆盖 welcome 指针(不是它指向的位置)并解组到新位置,因为您将指针传递给了指针。因此,您最终会将空字符串附加到数据中。

理论要掌握,实操不能落!以上关于《使用JSON Unmarshal解析循环中的数据》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>