2016-06-20 8 views
-5

私は第三者のソフトウェアからjsonを解析しようとしています。このようなjsonを返しますJson Parsing in Golang

{ 
    "top1/dir1": "10", 
    "top1/dir2": "20", 
    "top1/dir3": "30", 
    "top2/diff_val1": "40" 
} 

JSONLintはこれが有効なjsonだと言います。しかし、私はこれをゴランとどのように解析できるのか分かりませんでした。

上記のjsonファイルを解析するために使用したコード(明確にするために、別のstackoverflowポストからコードを取得しました)。私は行くの実行main.goを行うと、私は

$が行く以下のエラーを取得

package main 

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

type mytype []map[string]string 

func main() { 
     var data mytype 
     file, err := ioutil.ReadFile("t1.json") 
     if err != nil { 
       log.Fatal(err) 
     } 
     err = json.Unmarshal(file, &data) 
     if err != nil { 
       log.Fatal(err) 
     } 
     fmt.Println(data) 
} 

main.go 2016年6月19日夜09時53分57秒JSON実行:ゴーにすることはできませんアンマーシャリングオブジェクトをmain.mytypeタイプの値 終了ステータス1

このフォーマットを別のライブラリ "github.com/Jeffail/gabs"で解析しようとしましたが、失敗しました。これは有効なjsonであるため、これは解析できるとはかなり確信していますが、わかりません。

答えて

5

JSON文字列をデコードするメソッドを備えたGoパッケージがあります。ここで

https://golang.org/pkg/encoding/json/#Unmarshal

使い方の例です:

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    var jsonBlob = []byte(`[ 
     {"Name": "Platypus", "Order": "Monotremata"}, 
     {"Name": "Quoll", "Order": "Dasyuromorphia"} 
    ]`) 
    type Animal struct { 
     Name string 
     Order string 
    } 
    var animals []Animal 
    err := json.Unmarshal(jsonBlob, &animals) 
    if err != nil { 
     fmt.Println("error:", err) 
    } 
    fmt.Printf("%+v", animals) 
} 

EDIT:マリク、ポインタを渡す間違っている値の種類によって指摘されているように。この場合、タイプはmap[string]interface{}(JSONフィールドには文字列が格納されない可能性があります)またはmap[string]string[]map[string]stringではなく)が適している必要があります。最初の括弧は間違っています:これはJSONオブジェクトの配列です。

+0

私はgolangのjson構文解析に精通しています。この特定の形式は '{" top1/dir1 ":" 10 "、" top1/dir2 ":" 20 "}'を構文解析することができないものです。 –

+1

@SivaramKannanあなたはおそらく、私たちが答えを見つけるのを手助けすることです、あなたの質問はかなり曖昧なので、downvotes。 –

+0

あいまいな質問を残念。私はフォーマットされたjsonと私が解析するために使用しているgoコードで私の元の投稿を更新しました。 –

0

ジョナサンの答えは、JSONの解読の良い例を提供し、関連するパッケージをリンクします。あなたの解析に間違っていることを詳しく説明していませんが、推測しなければJSONがアンマーシャリングされた後にJSONを含む適切な構造体が作成されていない可能性があります。 Goは静的に型付けされているため、データは明示的に定義された形式に従うことが必要です。

structを定義する手間を掛けたくない場合は、空のインターフェイスオブジェクトを使用することができます。これは、Goのすべての種類のキャッチです。型[] interface {}を持つ変数を宣言し、それをJSONのunmarshal関数に渡します。お役に立てれば!

+0

ありがとう、私はこのコメントをupvoteできることを望む! –

1

あなたのプログラムに小さな誤植があるだけです。マップだけでなく、mytypeを地図のスライスとして宣言しました。

ちょうど変更:

type mytype []map[string]string 

へ:

type mytype map[string]string 

は、例えばhttps://play.golang.org/p/pZQl8jV5TCを参照してください。