手动读取JSON值

jim*_*jim 4 json go

在Go中,我通常将我的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"
  ]
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*aaz 7

不要声明你不想要的字段.

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)

}
Run Code Online (Sandbox Code Playgroud)

或者如果你想完全摆脱结构:

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

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

要么.它会吞下所有转换错误.

m := make(map[string]string)

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

fmt.Printf("%#v\n", m)
fmt.Println(m["title"])
Run Code Online (Sandbox Code Playgroud)


Kae*_*dys 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)

}
Run Code Online (Sandbox Code Playgroud)