2017-08-23 13 views
-2

以下は、私が解析しようとしているJSONファイルです(好奇心が強い人はOpenWeatherMap APIです)。組み込みのencoding/jsonはそれのかなり良い仕事をします。 json.Unmarshal(testJson, &parsed)を使用すると、ほとんどのJSONファイルが正しく解析されます。しかし、それがフォーマットされている方法では、 "天気"は私に頭痛を与えています。Goで配列を使用したJSONファイルの解析

私はencoding/jsonで生成されたファイルをparsedMap := parsed.(map[string]interface{})と解析しました。これは、キーと値のペアをキー "main"で参照しようとすると動作します。

fmt.Println()の場合、値はmap[temp:280.32 pressure:1012 humidity:81 temp_min:279.15 temp_max:281.15]で、私はこれを使用できます。

しかし、キー「天気」では、これは[map[icon:09d id:300 main:Drizzle description:light intensity drizzle]]となります。追加の角括弧は問題を引き起こしているようです。参考のため

{ 
    "coord": { 
     "lon": -0.13, 
     "lat": 51.51 
    }, 
    "weather": [ 
     { 
     "id": 300, 
     "main": "Drizzle", 
     "description": "light intensity drizzle", 
     "icon": "09d" 
     } 
    ], 
    "base": "stations", 
    "main": { 
     "temp": 280.32, 
     "pressure": 1012, 
     "humidity": 81, 
     "temp_min": 279.15, 
     "temp_max": 281.15 
    }, 
    "visibility": 10000, 
    "wind": { 
     "speed": 4.1, 
     "deg": 80 
    }, 
    "clouds": { 
     "all": 90 
    }, 
    "dt": 1485789600, 
    "sys": { 
     "type": 1, 
     "id": 5091, 
     "message": 0.0103, 
     "country": "GB", 
     "sunrise": 1485762037, 
     "sunset": 1485794875 
    }, 
    "id": 2643743, 
    "name": "London", 
    "cod": 200 
    } 

コード:= // JSON以前の記事 Varの

のvar testJSONは、最初の配列として天候タイプアサーションを実行する必要が

json.Unmarshal(testJSON, &parsed) 

parsedMap := parsed.(map[string]interface{}) 
mainTemp := parsedMap["weather"] 


fmt.Println(mainTemp) 
+2

私は実際問題が何かを理解していません。なぜあなたは助けを求めたのですか? – NatNgs

+1

これは期待される振る舞いです:もしそれが異なっていたら、 'json.Unmarshal'はあなたのJSONで使っているような長さのスライスを扱うことができません。 – fuglede

+0

@NatNgs基本的には、「角括弧を削除する」というヘルプが必要です。配列(インデックス0を参照)として参照しようとしたときに動作しませんでした –

答えて

1

インターフェースを{}構文解析しましたインタフェース{}のあなたがここにhttps://play.golang.org/p/JIfCGrsYl9

+0

それはうまくいった。私はこれがGoでの最初の1日のプログラミングのためのあまりにも難しいプロジェクトだと思います。また、私が現在住んでいる場所(中国)でgolang.orgが禁止されており、利用できるリソースが限られているだけでは助けになりません。 –

+0

確かに、キャストはありません(タイプアサーションとタイプ変換のみ)。あなたはここでタイプアサーションを使用しています:(https://golang.org/ref/spec#Type_assertions) –

+0

あなたは正しいです。それを反映するために私の答えを更新します – rouzier

0

問題の完全な例を見ることができます

temps := parsedMap["weather"].([]interface{}) 
mainTemp := temps[0].(map[string]interface{}) 

が続いてマップとして最初の要素に同じ行う[文字列]インターフェースは、{}あなたのようにキャストする必要があるということです[]interface{}

しかし、期待しているJSONの構造型を簡単に生成するには、JSON to Goを使用してください。あなたは興味のないフィールドを取り除くことができます。

多くのタイプキャスト(およびエラーチェック)を保存します!

+0

これは非常に素晴らしいツールのようです。ありがとう –

関連する問題