3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
我們可以通過實(shí)現(xiàn)json.Marshaler接口來自定義對(duì)象的序列化方式。對(duì)于我們的特殊情況,我們似乎有一個(gè)Row元素切片,我們希望將其編碼為一個(gè)異構(gòu)值數(shù)組。我們可以通過MarshalJSON在我們的Row類型上定義一個(gè)函數(shù)來做到這一點(diǎn),使用中間切片interface{}對(duì)混合值進(jìn)行編碼。
這個(gè)例子演示了:
package main
import (
"encoding/json"
"fmt"
)
type Row struct {
Ooid string
Score float64
Text string
}
func (r *Row) MarshalJSON() ([]byte, error) {
arr := []interface{}{r.Ooid, r.Score, r.Text}
return json.Marshal(arr)
}
func main() {
rows := []Row{
{"ooid1", 2.0, "S?me text"},
{"ooid2", 1.3, "?ther text"},
}
marshalled, _ := json.Marshal(rows)
fmt.Println(string(marshalled))
}
當(dāng)然,我們也可能想反過來,從 JSON 字節(jié)回到結(jié)構(gòu)體。所以我們可以使用一個(gè)類似的json.Unmarshaler接口。
func (r *Row) UnmarshalJSON(bs []byte) error {
arr := []interface{}{}
json.Unmarshal(bs, &arr)
// TODO: add error handling here.
r.Ooid = arr[0].(string)
r.Score = arr[1].(float64)
r.Text = arr[2].(string)
return nil
}
這使用了類似的技巧,首先使用 的中間切片interface{},使用解組器將值放入這個(gè)通用容器中,然后將值放回我們的結(jié)構(gòu)中。
package main
import (
"encoding/json"
"fmt"
)
type Row struct {
Ooid string
Score float64
Text string
}
func (r *Row) UnmarshalJSON(bs []byte) error {
arr := []interface{}{}
json.Unmarshal(bs, &arr)
// TODO: add error handling here.
r.Ooid = arr[0].(string)
r.Score = arr[1].(float64)
r.Text = arr[2].(string)
return nil
}
func main() {
rows := []Row{}
text := `
[
["ooid4", 3.1415, "pi"],
["ooid5", 2.7182, "euler"]
]
`
json.Unmarshal([]byte(text), &rows)
fmt.Println(rows)
}
您可以在此處閱讀完整示例。

TA貢獻(xiàn)1725條經(jīng)驗(yàn) 獲得超8個(gè)贊
用 []interface{}
type Results struct {
Rows []interface{} `json:"results"`
}
如果要訪問存儲(chǔ)在中的值,則必須使用類型斷言 []interface{}
for _, row := range results.Rows {
switch r := row.(type) {
case string:
fmt.Println("string", r)
case float64:
fmt.Println("float64", r)
case int64:
fmt.Println("int64", r)
default:
fmt.Println("not found")
}
}
- 3 回答
- 0 關(guān)注
- 286 瀏覽
添加回答
舉報(bào)