2016-04-24 13 views
1

私は、golangを使用してJSONファイルをいくつかの構造体にデコードしようとしています。タイプの囲碁値に変換することはできませんアンマーシャリングオブジェクト[] main.TrackこのJSONをマーシャリングしようとするとGoエラーが発生するのはなぜですか?

私は理解していない

:しかし、私にしようとするときは、

JSONというエラーが発生します。問題のコードは次のとおりです。JSONはfound hereです。

package main 

import (
    "encoding/json" 
    "fmt" 
    "net/http" 
    "os" 
) 

// Tracks a group of Track types 
type Tracks struct { 
    Tracks []Track 
} 

// Track represents a singular track 
type Track struct { 
    Name string 
    URL string 
    Artist Artist 
} 

// Artist represents a single artist 
type Artist struct { 
    Name string 
    MBID string 
    URL string 
} 

func main() { 
    url := "http://ws.audioscrobbler.com/2.0/?method=geo.gettoptracks&api_key=c1572082105bd40d247836b5c1819623&format=json&country=Netherlands" 
    response, err := http.Get(url) 

    if err != nil { 
     fmt.Printf("%s\n", err) 
     os.Exit(1) 
    } 

    defer response.Body.Close() 

    var tracks Tracks 
    decodeErr := json.NewDecoder(response.Body).Decode(&tracks) 

    if decodeErr != nil { 
     fmt.Printf("%s\n", decodeErr) 
     os.Exit(1) 
    } 

    for _, track := range tracks.Tracks { 
     fmt.Printf("%s: %s\n", track.Artist.Name, track.Name) 
    } 
} 

私の最初の考え多分あなたは私がしなかった、構造体にすべての単一のJSON値を分類する必要がありますが、this articleを読めと言いれました:

をこれには2つの答えがあります。簡単なオプションは、あなたのデータがどのように見えるかを知ったときに、JSONをあなたが定義した構造体に解析することです。 構造体に収まらないフィールドは無視されます。まず、そのオプションについて説明します。

これは、そうではないと私を導きます。

このシナリオでは何が間違っていますか?

+0

あなたは[JSON-to-Goのツール]を使用して試すことができます問題のこの種を回避したい場合(https://mholt.github.io/json-to-go/)。基本的にはjsonを型定義に変換します。 – dragosplesca

答えて

0

Go型の構造は、JSONデータの構造と一致する必要があります。アプリケーションは、このJSONの太字の範囲のネストのレベルが不足している:{「トラック」:{「トラック」: [{

ここ

JSON一致するタイプを更新する方法は次のとおり

type Tracks struct { 
    Tracks struct { 
     Track []Track 
    } 
} 

... 

for _, track := range tracks.Tracks.Track { 
    fmt.Printf("%s: %s\n", track.Artist.Name, track.Name) 
} 
+0

もう少し説明していただけますか?私は上手く理解できていない気がします。 –

+0

私はこのようにするには、[この回答](http://stackoverflow.com/a/25966781/998117)の細かいことが分かりますが、オプションではありません。まだ動くはずですか?) –

+0

@DougSmith更新された回答を参照してください。 –

1

クエリに対するレスポンスのJSON構造を見ると、tracksというプロパティを持つ単一のオブジェクトが返されることがわかります。

{ 
    "tracks": { 
     "track": [ {...} ] 
    } 
} 

これを指定された構造体と比較すると、構造体が整列していないことがわかります。与えられたTracks構造体は、スライスのフィールドがTrackです。これをJSONとしてキャストすると、次のようになります。

{ 
    "tracks": [ { ... } ] 
} 

これはエラーの原因です。 JSONデコーダは、ルートJSONオブジェクトのtracksフィールドが配列になると予想しています。返されるのはtracksプロパティを含むオブジェクトですが、その値はtrackプロパティを含む別のJSONオブジェクトです。トラックの配列です。次のように、このスキーマを反映するように構造を更新することができます。

// A response object from the API 
type Response struct { 
    Tracks Tracks 
} 

// Tracks a group of Track types 
type Tracks struct { 
    Track []Track 
} 

// Track represents a singular track 
type Track struct { 
    Name string 
    URL string 
    Artist Artist 
} 
関連する問題