Я пытаюсь прочитать данные JSON из Интернета, но этот код возвращает пустой результат. Я не уверен, что я здесь делаю не так.
package main
import "os"
import "fmt"
import "net/http"
import "io/ioutil"
import "encoding/json"
type Tracks struct {
Toptracks []Toptracks_info
}
type Toptracks_info struct {
Track []Track_info
Attr []Attr_info
}
type Track_info struct {
Name string
Duration string
Listeners string
Mbid string
Url string
Streamable []Streamable_info
Artist []Artist_info
Attr []Track_attr_info
}
type Attr_info struct {
Country string
Page string
PerPage string
TotalPages string
Total string
}
type Streamable_info struct {
Text string
Fulltrack string
}
type Artist_info struct {
Name string
Mbid string
Url string
}
type Track_attr_info struct {
Rank string
}
func get_content() {
// json data
url := "http://ws.audioscrobbler.com/2.0/?method=geo.gettoptracks&api_key=c1572082105bd40d247836b5c1819623&format=json&country=Netherlands"
res, err := http.Get(url)
if err != nil {
panic(err.Error())
}
body, err := ioutil.ReadAll(res.Body)
if err != nil {
panic(err.Error())
}
var data Tracks
json.Unmarshal(body, &data)
fmt.Printf("Results: %v\n", data)
os.Exit(0)
}
func main() {
get_content()
}
type WebKeys struct { Keys []struct { X5t string X5c []string } }
даже когда фактические параметры в JSON, который вы разбираете, находятся в нижнем регистре. Пример JSON:{ "keys": [{ "x5t": "foo", "x5c": "baaaar" }] }
&http.Client{Timeout: 10 * time.Second}
или использовать совершенно другую библиотеку / стратегию?json.NewDecoder(r.Body).Decode(target)
будет не возвращать ошибку для некоторых типов искаженной JSON! Я просто потратил несколько часов, пытаясь понять, почему я продолжал получать пустой ответ - оказалось, что в исходном JSON была лишняя запятая, где ее не должно было быть. Я предлагаю вам использоватьjson.Unmarshal
вместо этого. Здесь также есть хорошая запись о других потенциальных опасностях использованияjson.Decoder
здесьВаша проблема заключалась в объявлениях срезов в ваших данных
structs
(за исключением тогоTrack
, что они не должны быть срезами ...). Это усугублялось некоторыми довольно глупыми именами полей в извлеченном json-файле, которые можно исправить с помощью structtags, см. Godoc .Приведенный ниже код успешно проанализировал json. Если у вас есть дополнительные вопросы, дайте мне знать.
источник
Вам нужны имена свойств в верхнем регистре в ваших структурах, чтобы их могли использовать пакеты json.
Верхние имена случае имущественные
exported properties
. Имена свойств в нижнем регистре не экспортируются.Вам также необходимо передать свой объект данных по ссылке (
&data
).источник
Результаты from
json.Unmarshal
(intovar data interface{}
) не соответствуют напрямую вашему типу Go и объявлениям переменных. Например,Вывод:
источник