go JSON nightmare - есть ли простой эквивалент [POSH] ConvertFrom- Json? - PullRequest
0 голосов
/ 09 июля 2020

В PowerShell, если я выполняю вызов REST и получаю какой-либо ответ json, я могу легко преобразовать $json | ConvertFrom-Json в нужный объект, чтобы я мог вносить изменения, отображать определенные c значения и т. Д.

Похоже, что в Go мне нужно либо определить struct, либо «динамически» преобразовать, используя map[string]interface{}.

Проблема с struct в том, что я пишу rest обработчик для платформы, которая, в зависимости от конечной точки, обслуживает совершенно разные ответы JSON, как и большинство REST API. Я не хочу определять struct для всех десятков возможных ответов.

Проблема с map[string]interface{} в том, что он загрязняет данные, генерируя строку с кучей нелепых «карт» префиксы и нежелательные [скобки].

ala: [map[current_user_role:admin id:1]]

Есть ли способ преобразовать ответ JSON, например:

{
   "current_user_role": "admin",
   "id": 1
}

Чтобы вернуть базовый c:

current_user_role: admin
id: 1

... БЕЗ определения struct?

1 Ответ

1 голос
/ 09 июля 2020

Ваш подход к использованию карты верен, если вы sh не указали структуру получаемых данных. Вам не нравится, как он выводится из fmt.Println, но я подозреваю, что вы путаете формат вывода с представлением данных. Распечатка их в формате, который вы считаете приемлемым, занимает пару строк кода и не так удобна, как в python или PowerShell, что может вас раздражать.

Вот рабочий пример ( ссылка на игровую площадку) :

package main

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

var data = []byte(`{
   "current_user_role": "admin",
   "id": 1
}`)

func main() {
    var a map[string]interface{}
    if err := json.Unmarshal(data, &a); err != nil {
        log.Fatal(err)
    }
    for k, v := range a {
        fmt.Printf("%s: %v\n", k, v)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...