2016-06-07 96 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