請一如既往地幫助我解決以下問題,無論 json 回應的型別如何,都會執行條件。這是一個回傳 json 的示例公共 url,如果回應符合結構,我們只記錄標題。然而,無論 json 回應是什么,代碼都在條件中(err ==nil)。如果我沒有錯的話,json 解碼器應該檢查回應的結構。
我的代碼在下面完成
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
)
type response struct {
UserID int `json:"userId"`
ID int `json:"id"`
Title string `json:"title"`
Body string `json:"body"`
}
func main() {
resp, err := http.Get("https://jsonplaceholder.typicode.com/posts/1")
if err != nil {
log.Fatalln(err)
}
var actual response
if err = json.NewDecoder(resp.Body).Decode(&actual); err == nil {
fmt.Printf("anotherLink from docker container: %s", actual.Title)
}
uj5u.com熱心網友回復:
默認情況下,忽略沒有相應結構欄位的物件鍵。使用DisallowUnknownFields使解碼器為未知鍵回傳錯誤。
d := json.NewDecoder(resp.Body)
d.DisallowUnknownFields()
if err = d.Decode(&actual); err == nil {
fmt.Printf("anotherLink from docker container: %s", actual.Title)
}
這種方法的問題在于結構型別必須包含服務器發送的每個欄位。如果服務器將來添加新欄位,則解碼將失敗。
如果未設定指定欄位,則更好的選擇是拒絕回應。
if err = json.NewDecoder(resp.Body).Decode(&actual); err != nil || actual.UserID == "" {
// Handle bad response.
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/375982.html
上一篇:當我將TabRow與Compose一起使用時,tabPositions在哪里實體化?
下一篇:Zap全域記錄器
