Отмена сортировки одного элемента в массиве - PullRequest
0 голосов
/ 05 мая 2018

Есть ли способ разбить массивы JSON на отдельные объекты в Go?

У меня есть ответ 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 голосов
/ 05 мая 2018

Для этого вам нужно настроить демаршаллинг. Один из способов - создать 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 для получения значения объекта. Посмотрите:

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

0 голосов
/ 05 мая 2018

Реализовать интерфейс unmarshaler для преобразования массива объекта в объект. Извлеките значение для ключа и затем разархивируйте свой 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) 
}

Детская площадка

...