Как распаковать JSON, который содержит целые числа, числа с плавающей запятой и строки чисел? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть несколько разных запросов данных JSON, которые передаются в мое приложение Go, которое содержит числа в разных форматах. Пример запроса следующий:

{
    "stringData":"123456",
    "intData": 123456,
    "floatData": 123456.0
}

Есть ли способ разархивировать эти данные в тип, который определяется данными JSON. Например, строковые данные будут «123456», int data будет 123456, а данные с плавающей запятой будут 123456.0. У меня нет структур, определенных для этих объектов JSON, и создание структур для них невозможно.

Я посмотрел на метод decoder.UseNumber () для преобразования данных в строки, но я не знаю, как обрабатывать разницу между stringData и intData после этого.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Расшифруйте до map[string]interface{} с помощью опции UseNumber . Используйте утверждение типа , чтобы найти числа и конвертировать их в зависимости от наличия символа ".".

dec := json.NewDecoder(r)
dec.UseNumber()

var m map[string]interface{}
err := dec.Decode(&m)
if err != nil {
    log.Fatal(err)
}

for k, v := range m {
    v, err := decodeValue(v)
    if err != nil {
        log.Fatal(err)
    }
for k, v := range m {
    v, err := decodeValue(v)
    if err != nil {
        log.Fatal(err)
    }
    switch v := v.(type) {
    case string:
        fmt.Printf("%s is a string with value %q\n", k, v)
    case int64:
        fmt.Printf("%s is a integer with value %d\n", k, v)
    case float64:
        fmt.Printf("%s is a float with value %f\n", k, v)
    default:
        fmt.Printf("%s is a %T with value %v\n", k, v, v)
    }
}


...

func decodeValue(v interface{}) (interface{}, error) {
    if vv, ok := v.(json.Number); ok {
        if strings.Contains(vv.String(), ".") {
            return vv.Float64()
        } else {
            return vv.Int64()
        }
    } else {
        return v, nil
    }
}

Запустите его на детской площадке .

В этом примере распечатывается то, что было найдено, и выходит из программы в случае ошибки. Если ваша цель - создать карту со значениями правильных типов, замените код, который печатает числа, на m[k] = n.

1 голос
/ 16 апреля 2019

Вы можете разархивировать json на интерфейс map [string] {}, а затем привести к нужным типам, используя type switch .

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