2 回答

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以將 JSON 解組為一片地圖,然后從該片中提取您需要的任何內(nèi)容:
package main
import (
"encoding/json"
"fmt"
"log"
)
type Entry struct {
Animalname string `json:"animal_name"`
Location string
}
func main() {
data := []byte(`[{"animal_name": "Goofy", "location": "Europe"}, {"person_name": "Gigo", "location": "Asia"}]`)
// json.Unmarshal will initialize it as a slice of maps: []map[string]string.
// Alternatively, you can set the type explicitly:
// var entries []map[string]string
var entries interface{}
err := json.Unmarshal(data, &entries)
if err != nil {
log.Fatal(err)
}
fmt.Println(entries)
}

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊
您可以json.Unmarshaler
在一片接口上實(shí)現(xiàn)該接口。然后在這個(gè)自定義函數(shù)中使用一些邏輯來(lái)確定應(yīng)該使用哪種結(jié)構(gòu)類型。在我們知道要使用哪種類型之前,我曾經(jīng)json.RawMessage
避免完全解組數(shù)據(jù)。
package main
import (
"encoding/json"
"strings"
"github.com/davecgh/go-spew/spew"
)
type EntitySlice []Entity
func (es *EntitySlice) UnmarshalJSON(bytes []byte) error {
var objSlice []json.RawMessage
err := json.Unmarshal(bytes, &objSlice)
if err != nil {
return err
}
for _, obj := range objSlice {
kv := make(map[string]json.RawMessage)
err = json.Unmarshal(obj, &kv)
if err != nil {
return err
}
var entityType string
for k := range kv {
i := strings.Index(k, "_name")
if i != -1 {
entityType = k[:i]
break
}
}
var e Entity
switch entityType {
case "person":
e = &Person{}
case "animal":
e = &Animal{}
}
err = json.Unmarshal(obj, &e)
if err != nil {
return err
}
*es = append(*es, e)
}
return nil
}
type Entity interface {
EntityMarker()
}
type Person struct {
Name string `json:"person_name"`
Location string
}
// Just so we implement Entity
func (p *Person) EntityMarker() {}
type Animal struct {
Name string `json:"animal_name"`
Location string
}
// Just so we implement Entity
func (a *Animal) EntityMarker() {}
func main() {
data := []byte(`[{"animal_name": "Goofy", "location": "Europe"}, {"person_name": "Gigo", "location": "Asia"}]`)
var entitySlice EntitySlice
err := json.Unmarshal(data, &entitySlice)
if err != nil {
spew.Dump(err)
}
spew.Dump(entitySlice)
}
- 2 回答
- 0 關(guān)注
- 113 瀏覽
添加回答
舉報(bào)