使用 Golang 重构 Json
Posted
技术标签:
【中文标题】使用 Golang 重构 Json【英文标题】:Restructuring Json using Golang 【发布时间】:2017-07-03 00:52:00 【问题描述】:我有以下 JSON 响应:
[
"talent_id": "b520ad50-5302-45ce-9121-5ff42d67b4fb",
"platform": "facebook",
"posts": [
"insights": [
"name": "post_impressions_organic_unique",
"values": [
"value": 1828
]
,
"name": "post_stories_by_action_type",
"values": [
"like": 42
]
],
"type": "photo",
"post_id": "24225267232_10154099759037233"
,
"insights": [
"name": "post_impressions_organic_unique",
"values": [
"value": 864
]
,
"name": "post_stories_by_action_type",
"values": [
"like": 19
]
],
"type": "photo",
"post_id": "24225267232_10154099756677233"
]
]
我需要将其重组/展平成这样:
"talent_id": "b520ad50-5302-45ce-9121-5ff42d67b4fb",
"platform": "facebook",
"posts": [
"post_id": "24225267232_10154051404062233",
"type": "photo",
"organic_impressions_unique": 8288,
"post_story_actions_by_type":
"shares": 234,
"comments": 838,
"likes": 8768
,
"post_id": "24225267232_10154051404062233",
"type": "photo",
"organic_impressions_unique": 8288,
"post_story_actions_by_type":
"shares": 234,
"comments": 838,
"likes": 8768
]
我正在使用结构来映射 JSON 响应:
type JsonData struct
TalentID string `json:"talent_id"`
Platform string `json:"platform"`
Posts []struct
PostID string `json:"post_id"`
Type string `json:"type"`
Insights []struct
//Data []map[string]interface
Name string `json:"name"`
`json:"insights"`
`json:"posts"`
我的问题是帖子中的数据以及如何映射它,我正在使用映射来填充数据并对其进行编组以生成 JSON 的新结构。
这是我的代码:
messages := [] JsonData
json.Unmarshal(body, &messages)
m := make(map[string]interface)
m["talent_id"] = messages[0].TalentID
m["platform"] = messages[0].Platform
for _, p := range messages[0].Posts
for _, i := range p.Insights
// here is where I got lost and couldn't know how to fill the data inside the posts
jsonString, err := json.Marshal(m)
if err != nil
fmt.Println("error:", err)
fmt.Println(string(jsonString))
附:指标 post_impressions_organic_unique 和 post_stories_by_action_type 不是静态的,它们可以更改或可能在此处返回其他键
【问题讨论】:
为什么不简单地在 struct 对象上运行 marshal?这会起作用,因为你已经提供了符文,它会正确地将其转换为 JSON。 不行,因为我不知道Insights []struct
里面会填什么
是的,所以只需在结构中定义一个[]map[string]interface
。它会自己处理一切。让它像Insights []map[string]interface
如果您甚至不确定它是否会是一个数组,那么只需将interface
放在那里。
不使用接口,错误:意外接口,需要字段名称或嵌入类型
【参考方案1】:
保持你的结构为:
type NameValue struct
Name string `json:"name"`
Values []map[string]interface `json:"values"`
type JsonData struct
TalentID string `json:"talent_id"`
Platform string `json:"platform"`
Posts []struct
PostID string `json:"post_id"`
Type string `json:"type"`
Insights []NameValue `json:"insights"`
`json:"posts"`
创建另一个类似的结构:
type JsonDataRes struct
TalentID string `json:"talent_id"`
Platform string `json:"platform"`
Posts []map[string]interface `json:"posts"`
在JsonData
结构中获得数据后,循环遍历洞察对象并手动将值分配给新的JsonDataRes
对象以及帖子[]map[string]interface
内的PostId
和Type
的值
【讨论】:
这样做时不起作用:for _, p := range messages[0].Posts for k, i := range p.Insights jsonRes.Posts["post_id"] = p.PostID fmt.Println(i) fmt.Println(k)
这也不起作用:for _, p := range messages[0].Posts for k, i := range p.Insights jsonRes.Posts[k]["post_id"] = p.PostID fmt.Println(i) fmt.Println(k)
区别在于jsonRes.Posts[k]
以上是关于使用 Golang 重构 Json的主要内容,如果未能解决你的问题,请参考以下文章