2016-06-07 95 views
4

在Go中,我通常將我的JSON解組爲一個結構體,並從結構體中讀取值..它工作得很好。手動讀取JSON值

這次我只關心JSON對象的某個元素,因爲整個JSON對象非常大,所以我不想創建一個結構體。

Go有沒有辦法讓我可以按照慣例使用鍵或迭代數組來查找JSON對象中的值。

考慮下面的JSON,我怎樣才能退出title字段。

{ 
    "title": "Found a bug", 
    "body": "I'm having a problem with this.", 
    "assignee": "octocat", 
    "milestone": 1, 
    "labels": [ 
    "bug" 
    ] 
} 
+2

你可以做一個專門結構爲你想要的部分。這來自Unmarshal()下的json包:*「要將JSON解組到一個結構中,Unmarshal會將傳入的對象鍵與Marshal所使用的鍵(結構字段名稱或其標記)進行匹配,首選精確匹配,但也接受一個事件 - unnsrshal只會設置結構的導出字段。「*如果該字段不存在,json鍵/值對應該被忽略。 – Snowman

+0

好吧,我認爲它會抱怨無與倫比的領域。謝謝。 – conor

回答

1

要擴展Darigaaz的答案,您還可以使用在解析函數中聲明的匿名結構。這避免了必須讓包級別類型聲明拋棄一次性用例的代碼。

https://play.golang.org/p/MkOo1KNVbs

package main 

import (
    "encoding/json" 
    "fmt" 
) 

func main() { 
    test := `{ 
     "title": "Found a bug", 
     "body": "I'm having a problem with this.", 
     "assignee": "octocat", 
     "milestone": 1, 
     "labels": [ 
      "bug" 
     ] 
    }` 

    var s struct { 
     Title string `json:"title"` 
    } 
    json.Unmarshal([]byte(test), &s) 

    fmt.Printf("%#v", s) 

} 
-4

更新:這個答案是錯誤的;我將它作爲不是要做的一個例子。

你應該看看它與一個正則表達式,然後(僞):

String s = {json source}; 
int i = s.indexOf("\"title\": \"") 
s.substring(i,s.indexOf("\"",i)) 

more on substrings in Java

+0

{「body」:「這裏走\」標題\「:\」接我\「」,「標題」:「抓住我,如果你可以」} – Darigaaz

+0

@達里加斯?那是因爲我過分複雜化了一個簡單的解決方案還是一線靈感? – Vale

+0

用正則表達式解析像「json/html/xml」這樣的「結構化」文本通常是一個糟糕的主意。我給了你一個例子。 – Darigaaz

6

不要宣告你不想領域。

https://play.golang.org/p/cQeMkUCyFy

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type Struct struct { 
    Title string `json:"title"` 
} 

func main() { 
    test := `{ 
     "title": "Found a bug", 
     "body": "I'm having a problem with this.", 
     "assignee": "octocat", 
     "milestone": 1, 
     "labels": [ 
      "bug" 
     ] 
    }` 

    var s Struct 
    json.Unmarshal([]byte(test), &s) 

    fmt.Printf("%#v", s) 

} 

或者,如果你想徹底擺脫結構的:

var i interface{} 
json.Unmarshal([]byte(test), &i) 

fmt.Printf("%#v\n", i) 
fmt.Println(i.(map[string]interface{})["title"].(string)) 

或者。它會吞噬所有轉換錯誤。

m := make(map[string]string) 

json.Unmarshal([]byte(test), interface{}(&m)) 

fmt.Printf("%#v\n", m) 
fmt.Println(m["title"]) 
0

退房go-simplejson

例子:

js, err := simplejson.NewJson([]byte(`{ 
    "test": { 
    "string_array": ["asdf", "ghjk", "zxcv"], 
    "string_array_null": ["abc", null, "efg"], 
    "array": [1, "2", 3], 
    "arraywithsubs": [{"subkeyone": 1}, 
    {"subkeytwo": 2, "subkeythree": 3}], 
    "int": 10, 
    "float": 5.150, 
    "string": "simplejson", 
    "bool": true, 
    "sub_obj": {"a": 1} 
    } 
}`)) 

if _, ok = js.CheckGet("test"); !ok { 
    // Missing test struct 
} 

aws := js.Get("test").Get("arraywithsubs") 
aws.GetIndex(0) 
+0

謝謝但是,imho,這對於添加外部依賴關係來說太微不足道了。 – conor

+1

@conor當然,這一切都取決於你的需求。例如,當我必須單元測試JSON有效載荷時,我特別喜歡這個庫。但是不要爲小任務添加第三方庫的好習慣:) – basgys