Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 解析嵌套的JSON字符串_Go - Fatal编程技术网

Go 解析嵌套的JSON字符串

Go 解析嵌套的JSON字符串,go,Go,我试图解析一个嵌套的json字符串 我确实是通过使用多个结构来实现的,但是我想知道我是否可以在不使用额外结构的情况下解析JSON 类型事件结构{ Events[]Event`json:“Events”` } 类型事件结构{ 名称字符串`json:“名称”` Url字符串`json:“Url”` 日期结构{ 开始结构{ LocalDate字符串 本地时间字符串 } } } 类型嵌入结构{ TM Events`json:“\u嵌入”` } func TMGetEventsByCategory(位置字

我试图解析一个嵌套的json字符串

我确实是通过使用多个结构来实现的,但是我想知道我是否可以在不使用额外结构的情况下解析JSON

类型事件结构{
Events[]Event`json:“Events”`
}
类型事件结构{
名称字符串`json:“名称”`
Url字符串`json:“Url”`
日期结构{
开始结构{
LocalDate字符串
本地时间字符串
}
}
}
类型嵌入结构{
TM Events`json:“\u嵌入”`
}
func TMGetEventsByCategory(位置字符串、类别字符串){
参数:=“city=“+location+”&classificationName=“+category+”&apikey=“+api\u key”
tmUrl:=tmBaseUrl+参数
resp,err:=http.Get(tmUrl)
变量嵌入
var tm事件
如果错误!=零{
log.Printf(“HTTP请求失败,错误为%s\n”,err)
}否则{
数据,Util:=ioutil.ReadAll(分别为正文)
err:=json.Unmarshal(数据和嵌入)
json.Unmarshal(数据和tm)
}
}
JSON数据如下所示:

{
  "_embedded": { 
     "events": [],
  },
  "OtherStuff": {
  }
}


是否可以去掉嵌入结构并直接读取json字符串的事件部分?

这里要查找的是
json.RawMessage
。它可以帮助延迟对某些值的解析,在您的例子中,
map[string]json.RawMessage
应该表示可以选择性解析值的顶级对象。下面是一个简化的示例,您可以根据自己的情况进行调整:

package main

import (
    "encoding/json"
    "fmt"
)

type Event struct {
    Name string `json:"name"`
    Url  string `json:"url"`
}

func main() {
    bb := []byte(`
    {
        "event": {"name": "joe", "url": "event://101"},
        "otherstuff": 15.2,
        "anotherstuff": 100
    }`)

    var m map[string]json.RawMessage
    if err := json.Unmarshal(bb, &m); err != nil {
        panic(err)
    }

    if eventRaw, ok := m["event"]; ok {
        var event Event
        if err := json.Unmarshal(eventRaw, &event); err != nil {
            panic(err)
        }
        fmt.Println("Parsed Event:", event)
    } else {
        fmt.Println("Can't find 'event' key in JSON")
    }
}
在您的情况下,查找
\u embedded
键,然后
解组
它对
事件的值

当然可以

type Embed struct {
    TM []struct {
        Name  string `json:"name"`
        Url   string `json:"url"`
        Dates struct {
            Start struct {
                LocalDate string
                LocalTime string
            }
        } // add tag here if you want 
    } `json:"_embedded"`
}

如果不想声明额外的类型,可以始终使用匿名结构变量。例如,
var-embedded-struct{TM-Events`json:“\u-embedded”`}
。或者,您可以使用
映射
,例如
var embed map[string]Events
,但是请记住,在这种情况下,所有json的属性都必须不可映射到映射的元素类型中,也就是说,
“OtherStuff”
下的对象也必须不可映射到事件,否则将出现错误。