为了账号安全,请及时绑定邮箱和手机立即绑定

仅知道一半密钥时解组 JSON

仅知道一半密钥时解组 JSON

Go
慕丝7291255 2022-10-24 10:23:50
当您只知道一半的键名时,是否可以解组 JSON 响应?例子:data := []byte(`[{"animal_name": "Goofy", "location": "Europe"},  {"person_name": "Gigo", "location": "Asia"}]`)在这种情况下,有两种可能性,键名以某种标识符 ( animal, person) 开头并始终以 . 结尾_key。可以有更多(随机)标识符。endswith在 python 中,您可以尝试使用或类似的方式检索键值。但是有可能这样做go吗?https://go.dev/play/p/HGQ7qFgehve.go
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您可以将 JSON 解组为一片地图,然后从该片中提取您需要的任何内容:


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)

}


查看完整回答
反对 回复 2022-10-24
?
冉冉说

TA贡献1877条经验 获得超1个赞

您可以json.Unmarshaler在一片接口上实现该接口。然后在这个自定义函数中使用一些逻辑来确定应该使用哪种结构类型。在我们知道要使用哪种类型之前,我曾经json.RawMessage避免完全解组数据。


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)

}


查看完整回答
反对 回复 2022-10-24
  • 2 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信