當您只知道密鑰名稱的一半時,是否可以解組 JSON 回應?
例子:
data := []byte(`[{"animal_name": "Goofy", "location": "Europe"}, {"person_name": "Gigo", "location": "Asia"}]`)
在這種情況下,有兩種可能性,鍵名以某種識別符號 ( animal, person)開頭,并始終以 結尾_key。可以有更多(隨機)識別符號。
在python中,您可以嘗試使用endswith或類似的方法檢索鍵值。但是有可能這樣做go嗎?
https://go.dev/play/p/HGQ7qFgehve.go
uj5u.com熱心網友回復:
您可以將 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)
}
uj5u.com熱心網友回復:
您可以在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)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404494.html
標籤:
