仅知道一半密钥时解组 JSON

当您只知道一半的键名时,是否可以解组 JSON 响应?

例子:

data := []byte(`[{"animal_name": "Goofy", "location": "Europe"},  {"person_name": "Gigo", "location": "Asia"}]`)

在这种情况下,有两种可能性,键名以某种标识符 ( animalperson) 开头并始终以 . 结尾_key。可以有更多(随机)标识符。

endswith在 python 中,您可以尝试使用或类似的方式检索键值。但是有可能这样做go吗?

https://go.dev/play/p/HGQ7qFgehve.go


慕丝7291255
浏览 94回答 2
2回答

慕码人2483693

您可以将 JSON 解组为一片地图,然后从该片中提取您需要的任何内容:package mainimport (    "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)}

冉冉说

您可以json.Unmarshaler在一片接口上实现该接口。然后在这个自定义函数中使用一些逻辑来确定应该使用哪种结构类型。在我们知道要使用哪种类型之前,我曾经json.RawMessage避免完全解组数据。package mainimport (    "encoding/json"    "strings"    "github.com/davecgh/go-spew/spew")type EntitySlice []Entityfunc (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 Entityfunc (p *Person) EntityMarker() {}type Animal struct {    Name     string `json:"animal_name"`    Location string}// Just so we implement Entityfunc (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)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go