Dunaevlad
@Dunaevlad

Как структурировать JSON объект?

В python, есть pprint, который выводит хорошо структурированный JSON.
Пытаюсь получить тоже самое в Golang, но не выходит, бьюс уже второй день, помогите)
func main() {
	artist := "Madonna"
	token := "5936fb55e90cdd9938f8e7086c783c40"
	url := fmt.Sprintf(
		"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=%s&api_key=%s&format=json", artist, token)
	res, err := http.Get(url)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()

	body, _ := ioutil.ReadAll(res.Body)
	data, err := json.MarshalIndent(string(body), "", "\t")

	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(data))
}
  • Вопрос задан
  • 241 просмотр
Решения вопроса 2
includedlibrary
@includedlibrary
Можно использовать Indent
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func main() {
	artist := "Madonna"
	token := "5936fb55e90cdd9938f8e7086c783c40"
	url := fmt.Sprintf(
		"http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=%s&api_key=%s&format=json", artist, token)
	res, err := http.Get(url)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		log.Fatal(err)
	}

	var pretty bytes.Buffer
	err = json.Indent(&pretty, body, "", "\t")
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("%v\n", string(pretty.Bytes()))
}
Ответ написан
EvgenyMamonov
@EvgenyMamonov Куратор тега Go
Senior software developer, system architect
Так как вы делаете не получится :)

Вы получаете данные, которые нужно преобразовать из JSON в структуру данных Go).
и дальше с ними работать, а вы преобразовываете JSON (слайс байтов) в слайс байтов.

Вот рабочий пример того, что вы хотите сделать
package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    artist := "Madonna"
    token := "5936fb55e90cdd9938f8e7086c783c40"
    url := fmt.Sprintf(
        "http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=%s&api_key=%s&format=json", artist, token)
    res, err := http.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer res.Body.Close()

    body, _ := ioutil.ReadAll(res.Body)

    var data map[string]interface{}
    // десериализуете JSON
    err = json.Unmarshal(body, &data)
    if err != nil {
        log.Fatal(err)
    }

    // сериализуете данные в JSON
    marshaledDataBytes, err := json.MarshalIndent(data, "", "\t")
    fmt.Println(string(marshaledDataBytes))
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Табуляцию замените на 2 или 4 пробела
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы