有没有办法在Go中将JSON数组解组为单个对象?
我有来自端点的json响应:
{
"results": [
{
"key": "value"
}
]
}
我有一个Go结构用于数组中的对象:
type Object struct {
Key string `json:"key"`
}
...以及响应对象的结构:
type Response struct {
Objects []Object `json:"results"`
}
results
是一个对象数组,但我知道端点只会返回一个包含1个对象的数组。有没有办法解组数据并避免通过索引引用对象?我希望我可以使用像json:"results[0]"
这样的字段标记。
我希望能够:
decoder.Decode(&response)
response.Object.Key
而不是
decoder.Decode(&response)
response.Objects[0].Key
答案 0 :(得分:2)
要执行此操作,您需要自定义解组。 一种方法是创建一个ResponseCustom,如:
//Response json (customized) that match with Unmarshaler interface
type ResponseCustom struct {
Object
}
func (r *ResponseCustom) UnmarshalJSON(b []byte) error{
rsp := &Response{}
err := json.Unmarshal(b, rsp)
if err != nil {
log.Fatalln("error:", err)
} else {
r.Object = rsp.Objects[0]
}
//
return err
}
因此,您可以使用ResponseCustom代替您使用Response for get Object值。 看:
func main() {
//
data := []byte(jsondata)
resp := &ResponseCustom{}
//
json.Unmarshal(data, resp)
//
fmt.Println("My Object.value is: " + resp.Object.Key)
}
结果是:
My Object.value is: value
答案 1 :(得分:0)
实现unmarshaler接口以将对象数组转换为对象。获取key的值,然后将您的json解组为
package main
import(
"fmt"
"encoding/json"
)
type Object struct {
Key string `json:"key"`
}
func (obj *Object) UnmarshalJSON(data []byte) error {
var v map[string]interface{}
if err := json.Unmarshal(data, &v); err != nil {
fmt.Printf("Error whilde decoding %v\n", err)
return err
}
obj.Key = v["results"].(interface{}).([]interface{})[0].(interface{}).(map[string]interface{})["key"].(interface{}).(string)
return nil
}
func main(){
var obj Object
data := []byte(`{
"results": [
{
"key": "value"
}
]
}`)
if err := json.Unmarshal(data, &obj); err!=nil{
fmt.Println(err)
}
fmt.Printf("%#v", obj)
}