1 回答

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
在大多數(shù)情況下,您只想使用 json.Unmarshal。這個(gè)用例大部分時(shí)間都有效:
var myClient = &http.Client{Timeout: 10 * time.Second}
func getJson(url string, target interface{}) error {
? ? r, err := myClient.Get(url)
? ? if err != nil {
? ? ? ? return err
? ? }
? ? defer r.Body.Close()
? ? return json.NewDecoder(r.Body).Decode(target)
}
foo := Foo{}
getJson("http://example.com", &foo2)
fmt.Printf("%+v\n", foo)
但是,如果您真正使用的是大型數(shù)據(jù)集,請(qǐng)查看https://golang.org/pkg/encoding/json/#example_Decoder_Decode_stream
package main
import (
? ? "encoding/json"
? ? "fmt"
? ? "log"
? ? "strings"
)
func main() {
? ? const jsonStream = `
? ? [
? ? ? ? {"Name": "Ed", "Text": "Knock knock."},
? ? ? ? {"Name": "Sam", "Text": "Who's there?"},
? ? ? ? {"Name": "Ed", "Text": "Go fmt."},
? ? ? ? {"Name": "Sam", "Text": "Go fmt who?"},
? ? ? ? {"Name": "Ed", "Text": "Go fmt yourself!"}
? ? ]
`
? ? type Message struct {
? ? ? ? Name, Text string
? ? }
? ? dec := json.NewDecoder(strings.NewReader(jsonStream))
? ? // read open bracket
? ? t, err := dec.Token()
? ? if err != nil {
? ? ? ? log.Fatal(err)
? ? }
? ? fmt.Printf("%T: %v\n", t, t)
? ? // while the array contains values
? ? for dec.More() {
? ? ? ? var m Message
? ? ? ? // decode an array value (Message)
? ? ? ? err := dec.Decode(&m)
? ? ? ? if err != nil {
? ? ? ? ? ? log.Fatal(err)
? ? ? ? }
? ? ? ? fmt.Printf("%v: %v\n", m.Name, m.Text)
? ? }
? ? // read closing bracket
? ? t, err = dec.Token()
? ? if err != nil {
? ? ? ? log.Fatal(err)
? ? }
? ? fmt.Printf("%T: %v\n", t, t)
}
這將使您能夠以更高效的內(nèi)存方式工作。
對(duì)于您的更多問題:
我是否必須解組為完整的響應(yīng)結(jié)構(gòu)?- 不是真的,你只需要定義你想在結(jié)構(gòu)中使用的東西,其余的將被忽略
你做對(duì)了嗎?- 你沒有做任何本質(zhì)上錯(cuò)誤的事情嗎?
如果有什么我沒有回答的,請(qǐng)告訴我。
對(duì)于您的使用ioutil.ReadAll
-一般來說,您需要解組為一個(gè)結(jié)構(gòu),以便您可以實(shí)際使用數(shù)據(jù),并通過您的結(jié)構(gòu)從類型安全中受益。如果您確實(shí)只需要字符串,那么您所做的就很好,但通常情況并非如此。
- 1 回答
- 0 關(guān)注
- 134 瀏覽
添加回答
舉報(bào)