解组数组

时间:2018-05-05 11:13:11

标签: json go unmarshalling

有没有办法在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

2 个答案:

答案 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

在操场上:https://play.golang.org/p/zo7wOSacA4w

答案 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) 
}

Playground