Как демонтировать JSON в массив интерфейса и использовать - PullRequest
0 голосов
/ 06 июня 2018

Мне трудно понять, как правильно разархивировать некоторые данные JSON, которые передаются в массив типа inteface, а затем использовать его.Я попытался сделать этот пример кода максимально простым, чтобы проиллюстрировать проблему, с которой я столкнулся.Код можно найти на игровой площадке здесь: https://play.golang.org/p/U85J_lBJ7Zr

Вывод выглядит так:

[map [ObjectType: идентификатор стула: 1234 Бренд: Blue Inc.] map [ID: 5678 Расположение: Кухня ObjectType: table]] {} false {} false

Код

package main

import (
    "fmt"
    "encoding/json"
)

type Chair struct {
    ObjectType string
    ID string
    Brand string
}

type Table struct {
    ObjectType string
    ID string
    Location string
}

type House struct {
    Name string
    Objects []interface{}
}



func main() {
    var h House
    data := returnJSONBlob()
    err := json.Unmarshal(data, &h)
    if err != nil {
       fmt.Println(err)
    }
    fmt.Println(h.Objects)
    s1, ok := h.Objects[0].(Table)
    fmt.Println(s1, ok)
    s2, ok := h.Objects[0].(Chair)
    fmt.Println(s2, ok)

}

func returnJSONBlob() []byte {
    s := []byte(`
{
  "Name": "house1",
  "Objects": [
    {
      "ObjectType": "chair",
      "ID": "1234",
      "Brand": "Blue Inc."
    },
    {
      "ObjectType": "table",
      "ID": "5678",
      "Location": "Kitchen"
    }
  ]
}
    `)
    return s
}

1 Ответ

0 голосов
/ 06 июня 2018

Я не уверен, практично ли это, так как это упрощенная версия вашего сценария.Однако один из способов сделать это - объединить два типа объектов в новый тип Object, а затем распаковать их непосредственно в Object вместо использования interface{}:

package main

import (
    "encoding/json"
    "fmt"
)

type Object struct {
    ObjectType string
    ID         string
    Brand      string
    Location   string
}

type House struct {
    Name    string
    Objects []Object
}

func returnJSONBlob() []byte {
    s := []byte(`
{
  "Name": "house1",
  "Objects": [
    {
      "ObjectType": "chair",
      "ID": "1234",
      "Brand": "Blue Inc."
    },
    {
      "ObjectType": "table",
      "ID": "5678",
      "Location": "Kitchen"
    }
  ]
}
    `)
    return s
}

func main() {
    var h House
    data := returnJSONBlob()
    err := json.Unmarshal(data, &h)
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(h.Objects[0].Brand)
    fmt.Println(h.Objects[1].Location)

}

Prints:

Blue Inc.

Кухня

Пример здесь: https://play.golang.org/p/91F4UrQlSjJ

...