第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

僅知道一半密鑰時(shí)解組 JSON

僅知道一半密鑰時(shí)解組 JSON

Go
慕絲7291255 2022-10-24 10:23:50
當(dāng)您只知道一半的鍵名時(shí),是否可以解組 JSON 響應(yīng)?例子:data := []byte(`[{"animal_name": "Goofy", "location": "Europe"},  {"person_name": "Gigo", "location": "Asia"}]`)在這種情況下,有兩種可能性,鍵名以某種標(biāo)識(shí)符 ( animal, person) 開(kāi)頭并始終以 . 結(jié)尾_key??梢杂懈啵S機(jī))標(biāo)識(shí)符。endswith在 python 中,您可以嘗試使用或類似的方式檢索鍵值。但是有可能這樣做go嗎?https://go.dev/play/p/HGQ7qFgehve.go
查看完整描述

2 回答

?
慕碼人2483693

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)

}


查看完整回答
反對(duì) 回復(fù) 2022-10-24
?
冉冉說(shuō)

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)

}


查看完整回答
反對(duì) 回復(fù) 2022-10-24
  • 2 回答
  • 0 關(guān)注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)