Как распаковать массив JSON разных типов данных? - PullRequest
0 голосов
/ 05 июня 2018

Часть JSON, которую я пытаюсь разобрать, имеет массив, который может содержать либо строки, либо целые числа.Как мне разобраться?

{
    "id": "abc",
    "values": [1,2,3]
},
{
    "id": "def",
    "values": ["elephant", "tomato", "arrow"]
},
{
    //etc...
}

Я попробовал следующее:

type Thing struct {
    ID      string   `json:"id"`
    Values  []string `json:"values,string,omitempty"`
}

Получите следующую ошибку:

panic: json: cannot unmarshal array into Go struct field Thing.values of type string

1 Ответ

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

Вы можете установить тип поля Значения на [] interface {}, но вам, возможно, придется использовать некоторые утверждения типа.

Вот ссылка на игровую площадку, где я использую предоставленные вами данные:https://play.golang.org/p/ahePgggr8o1

Я в любом случае вставлю сюда код:

package main

import (
    "fmt"
    "encoding/json"
)

type Thing struct {
    ID      string   `json:"id"`
    Values  []interface{} `json:"values,omitempty"`
}

func print(values []interface{}) {
    for _, v := range values{
        switch value := v.(type){
        case string:
            fmt.Println("String", value)
        case int:
            fmt.Println("Integer", value)
        case float64:
            fmt.Println("Floats", value)
        default:
            fmt.Printf("I don't know about type %T!\n", v)
        }
    }
}

func main() {
    var t1, t2 Thing
    data := []byte("{ \"id\": \"abc\", \"values\": [1,2,3]}")
    data2 := []byte("{ \"id\": \"def\", \"values\": [\"elephant\", \"tomato\", \"arrow\"]}")
    _ = json.Unmarshal(data, &t1)
    _ = json.Unmarshal(data2, &t2)
    print(t1.Values)
    print(t2.Values)
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...