使用json.Unmarshal将http.Response转换为结构

时间:2019-03-23 03:28:16

标签: go

我正在调用远程API并获取JSON响应。我正在尝试将*http.Response转换为我定义的结构。到目前为止,我尝试过的所有操作都导致一个空结构。这是我对json.Unmarshal

的尝试
type Summary struct {
   Created  string  `json:"created"`          
   High     float64 `json:"high"`             
   Low      float64 `json:"low"`              
}

func getSummary() {

   url := "http://myurl"

   resp, err := http.Get(url)
   if err != nil {
       log.Fatalln(err)
   }

   body, err2 := ioutil.ReadAll(resp.Body)
   if err2 != nil {
       panic(err.Error())
   }

   log.Printf("body = %v", string(body))
   //outputs: {"success":true,"message":"","result":["High":0.43600000,"Low":0.43003737],"Created":"2017-06-25T03:06:46.83"}]}

   var summary = new(Summary)
   err3 := json.Unmarshal(body, &summary)
   if err3 != nil {
       fmt.Println("whoops:", err3)
       //outputs: whoops: <nil> 
   }

   log.Printf("s = %v", summary)
   //outputs: s = &{{0 0 0  0 0 0  0 0 0  0}}


}

我在做什么错?我的结构中的JSON标签与响应中的json键完全匹配...

编辑:这是从API返回的JSON

{
  "success": true,
  "message": "''",
  "result": [
    {
      "High": 0.0135,
      "Low": 0.012,
      "Created": "2014-02-13T00:00:00"
    }
  ]
}

修改 我将结构更改为此,但仍无法正常工作

type Summary struct {
   Result struct {
       Created string  `json:"created"`
       High    float64 `json:"high"`
       Low     float64 `json:"low"`
   } 
 }

2 个答案:

答案 0 :(得分:2)

像这样更改您的结构

type Summary struct {
  Sucess bool `json:"success"`
  Message string `json:"message"`
  Result []Result `json:"result"`
}

type Result struct {
   Created string  `json:"Created"`
   High    float64 `json:"High"`
   Low     float64 `json:"Low"`
} 

尝试这个link

答案 1 :(得分:0)

这是因为您试图将数组解组为struct, 使用数组代替Result结构

type Summary struct {
    Result []struct {
        Created string  `json:"created"`
        High    float64 `json:"high"`
        Low     float64 `json:"low"`
    }
}

使用此网络链接将JSON对象转换为Go Struct >> https://mholt.github.io/json-to-go/