简体   繁体   English

解析 JSON 返回 EOF

[英]Parsing JSON returns EOF

I seem to overlook something.我似乎忽略了什么。 Trying to decode some json into a struct.试图将一些 json 解码为结构。 I have checked that the json response is valid.我检查了 json 响应是否有效。 Typing the URL into the browser returns that valid json.在浏览器中输入 URL 会返回有效的 json。 For some reason, though I still get an error EOF .出于某种原因,尽管我仍然收到错误EOF I have also used the json-to-go to verify my structs.我还使用json-to-go来验证我的结构。 Error is thrown at the json.NewDecoder(response.Body).Decode(&servResp) part json.NewDecoder(response.Body).Decode(&servResp)部分抛出错误

Code:代码:

type OnvistaServiceCallCandleData struct {
    Status   string      `json:"status"`
    ErrorMsg string      `json:"errorMsg"`
    Result   []AssetData `json:"result"`
}

type AssetData struct {
    Date   string `json:"date"`
    Open   string `json:"open"`
    High   string `json:"high"`
    Low    string `json:"low"`
    Close  string `json:"close"`
    Volume string `json:"volume"`
}

func ServiceOnvistaAssetData(data OnvistaInstrument) ([]models.InstrumentData, error) {
    url := "some-valid-url"


    myClient := http.Client{
        Timeout: time.Second * 10,
    }

    req, err := http.NewRequest(http.MethodGet, url, nil)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(url)

    response, getErr := myClient.Do(req)
    if getErr != nil {
        log.Fatal(getErr)
    }

    if response.Body != nil {
        defer response.Body.Close()
    } else {
        fmt.Println("response.Body nil")
    }
   
    servResp := OnvistaServiceCallCandleData{}
    jsonErr := json.NewDecoder(response.Body).Decode(&servResp)
    if jsonErr != nil {
        log.Fatal(jsonErr)
    }

    if servResp.Status == "error" {
        return []models.InstrumentData{}, errors.New(servResp.ErrorMsg)
    }

    currentLocation := time.Now().Location()
    toReturn := []models.InstrumentData{}
    for i := range servResp.Result {

        s := strings.Split(servResp.Result[i].Date, ".")
        dataTimestamp := time.Date(parseInt(s[2]), time.Month(parseInt(s[1])), parseInt(s[0]), 0, 0, 0, 0, currentLocation)

        newToReturn := models.InstrumentData{
            InstrumentID:  data.InstrumentID,
            DataTimestamp: dataTimestamp,
            Open:          parseFloat(servResp.Result[i].Open),
            Close:         parseFloat(servResp.Result[i].Close),
            High:          parseFloat(servResp.Result[i].High),
            Low:           parseFloat(servResp.Result[i].Low),
            Volume:        parseFloat(servResp.Result[i].Volume),
        }
        toReturn = append(toReturn, newToReturn)

    }

    return toReturn, nil
}

Ok I figured out what was wrong.好的,我知道出了什么问题。 In the URL I had some whitespace.在 URL 中,我有一些空格。 So url.QueryEscape() each parameter did the trick.所以url.QueryEscape()每个参数都可以解决问题。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM