2017-09-01 59 views
2

我有這樣一個JSON:Golang - 從文件解析未知JSON和迭代進去

{ 
    "store_name": "Barry's Farmer's Market", 
    "foods": { 
     "apple": "5.91", 
     "peach": "1.84", 
     "carrot": "6.44", 
     "beans": "3.05", 
     "orange": "5.75", 
     "cucumber": "6.42" 
    }, 
    "store_location": "Corner of Elm Tree Hill and 158th Street" 
} 

,我想用一個圖來解析它作爲一個未知的JSON [字符串]接口{}:

package main 

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

func main() { 
    var parsed map[string]interface{} 

    f, err := ioutil.ReadFile("input.txt") 
    if err != nil { 
     fmt.Printf("Error: %v", err) 
     os.Exit(1) 
    } 

    err = json.Unmarshal(f, &parsed) 
    for k, v := range parsed { 
     //fmt.Println(parsed["foods"]) 
     fmt.Println(k + string(v)) 
    } 

} 

考慮到「v」不會轉換爲字符串,並且我想將「食品」中的所有值範圍,您能幫助我嗎?我想我錯過了一些東西......

回答

4

如果你看了the documentation for json.Unmarshal,你可以看到它將使用什麼類型,並且將代碼基於它;或使用fmt.Printf("%T",v)來查看它在運行時的類型。

err = json.Unmarshal(f, &parsed) 
for k, v := range parsed["foods"].(map[string]interface{}) { 
    fmt.Println(k, v) 
} 

工作操場例如:https://play.golang.org/p/nczV5qA41h

+0

不錯和完美。你認爲使用「反射」包來查找我是否有字符串或地圖[字符串]接口會是一個好主意嗎? –

+0

如果你不知道結構是什麼,我會首先選擇[類型切換](https://golang.org/ref/spec#Switch_statements),如果你需要更多的靈活性,然後再回到反射。在大多數語言中,反思通常是最糟糕的選擇,包括Go。 – Adrian

+0

我想我只會使用_string_和_map [string] interface_,所以類型切換非常有幫助。謝謝。 –

0

你可以只讓其中包含map[string]string的結構和迭代這一點。 https://play.golang.org/p/IVlrTTcrVB

type Store struct { 
    Name  string   `json:"store_name"` 
    Foods map[string]string `json:"foods"` 
    Location string   `json:"store_location"` 
} 

func main() { 
    var store Store 
    data := []byte(jsonData) 
    err := json.Unmarshal(data, &store) 
    if err != nil { 
     panic(err) 
    } 
    for k, v := range store.Foods { 
     fmt.Println(k + string(v)) 
    } 
} 
+0

感謝您的回答,但我知道,再加上我想處理「未知」json文件。 –