2016-06-20 87 views
-5

我想從第三方軟件解析json。它返回一個像這樣的jsonJSON在Golang中的解析

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

JSONLint說這是一個有效的json。但我無法想象如何用golang解析這個問題。

我用來解析上面的json文件的代碼(要清楚我從另一個stackoverflow文章中獲取代碼)。

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,我得到下面的錯誤

$去運行,main.go 2016年6月19日22時53分57秒的JSON:不能解組對象爲圍棋值類型main.mytype 退出狀態1

我曾嘗試解析這種格式與另一個庫 - 「github.com/Jeffail/gabs」,但沒有成功。由於這是一個有效的JSON,我很確定這可以解析,但我不知道如何。

回答

5

有一個Go包與解碼JSON字符串的方法。

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) 
} 

編輯:正如馬利克,其指針傳遞是錯誤的值的類型指出。在這種情況下,您的類型應該是map[string]interface{}(最好是因爲JSON字段可能不存儲字符串)或map[string]string而不是[]map[string]string。開頭的括號是錯誤的:例如JSON對象的數組。

+0

我熟悉json在golang中的解析。這個特定的格式是我無法解析'{「top1/dir1」:「10,」top1/dir2「:」20「}' –

+1

@SivaramKannan你應該指定你想要解析的最終結果是爲了幫助我們找到答案,現在你的問題非常模糊,因此降價。 –

+0

對於模糊的問題抱歉。我使用格式化的json和我用來解析的代碼更新了原始文章。 –

0

Jonathan的答案提供瞭解碼JSON的一個很好的例子,並且鏈接了相關的包。你沒有提供關於你的解析到底出錯的細節,但是如果我不得不猜測,我會說你可能沒有創建一個合適的結構來包含JSON,一旦它被解組。因爲Go是靜態類型的,所以它希望數據遵循明確定義的格式。

如果你不想去定義結構的麻煩,你可以使用一個空的接口對象,這是一個在Go中的所有東西。只需聲明一個類型爲[] interface {}的變量,然後將其傳遞給JSON解組函數。希望這可以幫助!

+0

謝謝,我希望我能夠upvote這個評論! –

1

這只是你在你的程序中有一個小的錯字。您宣稱mytype是一張地圖片段,而不僅僅是一張地圖。

只要改變:

type mytype []map[string]string 

要:

type mytype map[string]string 

爲例見https://play.golang.org/p/pZQl8jV5TC