Golang декодирует JSON в слайс с одной строкой и одним float64 - PullRequest
0 голосов
/ 04 мая 2018

Я выполняю запрос к базе данных, которая у меня есть на сервере. Проблема в том, что когда я пытаюсь декодировать JSON в 2D-фрагмент, я получаю сообщение об ошибке, потому что один из них является строкой, а другой - float64.

Один из способов, с помощью которого я попытался решить эту проблему, - это изменить строку JSON перед тем, как расшифровать ее, добавив кавычки, чтобы сделать число строкой. Но есть ли лучший способ сделать это? Есть ли способ, которым я могу изменить структуру моего кода, где я могу декодировать код JSON?

2018/05/04 12:32:19 json: не может разархивировать число в поле структуры Go. Значения типа string

import (
"fmt"
"encoding/json"
"strings"
"io"
"log"
)

func main(){
    str := "{\"results\":[{\"statement_id\":0,\"series\":[{\"name\":\"_\",\"columns\":[\"time\",\"last\"],\"values\":[[\"2018-03-20T18:45:57.07Z\",142774272]]}]}]}"

    type Response struct {
        Results []struct {
            StatementID int `json:"statement_id"`
            Series []struct {
                Name string `json:"name"`
                Columns []string `json:"columns"`
                Values [][]string `json:"values"`
            } `json:"series"`
        } `json:"results"`
    }

    dec := json.NewDecoder(strings.NewReader(str))
        for {
            var m Response
            if err := dec.Decode(&m); err == io.EOF {
                break
            } else if err != nil {
                log.Fatal(err)
            }
            fmt.Println(m.Results[0].Series[0].Values[0])
        }
    }

1 Ответ

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

Это действительно неудачный API, с которым приходится работать, но есть (несколько неуклюжий) обходной путь:

Values [][]interface{} `json:"values"`

В основном это говорит о "массиве вещей неизвестного типа". Это позволит декодеру правильно декодировать, но потребует от вас сделать некоторые утверждения типа для фактического использования значений, чтобы перейти от «неизвестного типа» к известному типу, который вы действительно можете использовать:

strVal := m.Results[0].Series[0].Values[0][0].(string)
floatVal := m.Results[0].Series[0].Values[0][1].(float64)

Пример запуска: https://play.golang.org/p/ikIHnXlSlYx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...