1 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超13個(gè)贊
您需要自己進(jìn)行解組。有一篇非常好的文章展示了如何使用 json.RawMessage 權(quán)利和許多其他解決這個(gè)問題的方法,比如使用接口、RawMessage、實(shí)現(xiàn)你自己的解組和解碼函數(shù)等。
您可以在此處找到文章:Attila Oláh 在 GO 中的 JSON 解碼 注意:Attila 在他的代碼示例中犯了一些錯(cuò)誤。
我冒昧地整理了一個(gè)工作示例(使用 Attila 的一些代碼),它使用 RawMessage 來延遲解組,以便我們可以在我們自己的 Decode func 版本上進(jìn)行。
鏈接到 GOLANG 游樂場(chǎng)
package main
import (
"fmt"
"encoding/json"
"io"
)
type Record struct {
AuthorRaw json.RawMessage `json:"author"`
Title string `json:"title"`
URL string `json:"url"`
Author Author
}
type Author struct {
ID uint64 `json:"id"`
Email string `json:"email"`
}
func Decode(r io.Reader) (x *Record, err error) {
x = new(Record)
if err = json.NewDecoder(r).Decode(x); err != nil {
return
}
if err = json.Unmarshal(x.AuthorRaw, &x.Author); err == nil {
return
}
var s string
if err = json.Unmarshal(x.AuthorRaw, &s); err == nil {
x.Author.Email = s
return
}
var n uint64
if err = json.Unmarshal(x.AuthorRaw, &n); err == nil {
x.Author.ID = n
}
return
}
func main() {
byt_1 := []byte(`{"author": 2,"title": "some things","url": "https://stackoverflow.com"}`)
byt_2 := []byte(`{"author": "Mad Scientist","title": "some things","url": "https://stackoverflow.com"}`)
var dat Record
if err := json.Unmarshal(byt_1, &dat); err != nil {
panic(err)
}
fmt.Printf("%#s\r\n", dat)
if err := json.Unmarshal(byt_2, &dat); err != nil {
panic(err)
}
fmt.Printf("%#s\r\n", dat)
}
希望這可以幫助。
- 1 回答
- 0 關(guān)注
- 273 瀏覽
添加回答
舉報(bào)