Go 解析嵌套的JSON字符串
我试图解析一个嵌套的json字符串 我确实是通过使用多个结构来实现的,但是我想知道我是否可以在不使用额外结构的情况下解析JSONGo 解析嵌套的JSON字符串,go,Go,我试图解析一个嵌套的json字符串 我确实是通过使用多个结构来实现的,但是我想知道我是否可以在不使用额外结构的情况下解析JSON 类型事件结构{ Events[]Event`json:“Events”` } 类型事件结构{ 名称字符串`json:“名称”` Url字符串`json:“Url”` 日期结构{ 开始结构{ LocalDate字符串 本地时间字符串 } } } 类型嵌入结构{ TM Events`json:“\u嵌入”` } func TMGetEventsByCategory(位置字
类型事件结构{
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”
下的对象也必须不可映射到事件,否则将出现错误。