关键词:
【中文标题】使用 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 响应示例
】使用Golang的JSON响应示例【英文标题】:ExampleJSONresponsewithGolang【发布时间】:2019-11-2600:41:48【问题描述】:我正在尝试使用golang构建API。首先,我只是在访问http://localhost:8085/search时尝试发送一些json数据,但我在浏览器中查看... 查看详情
使用承诺重构代码以读取文件并将它们转换为 json
】使用承诺重构代码以读取文件并将它们转换为json【英文标题】:Refactorcodewithpromisestoreadfilesandconvertthemtojson【发布时间】:2020-06-0621:16:27【问题描述】:我正在尝试执行以下操作:读取目录的内容以查找所有.xml文件(我使用的... 查看详情
重构 JSON 对象数组
...据是重复的。有没有办法重组数组以排除重复值?我必须使用地图功能吗?还是for循环?userData=[id:\'101\',Time:\'3:00pm\',Date:\'5/25/20\',id:\'101\',Time:\'5:00pm\ 查看详情
Golang Json 使用多个动态命名字段解组
】GolangJson使用多个动态命名字段解组【英文标题】:GolangJsonunmarshalingwithmultipledynamicallynamedfields【发布时间】:2021-07-1102:04:09【问题描述】:我有以下需要解码的Json结构,但我不确定正确的方法用于解组它。varb=[]byte(`"Card:5417871... 查看详情
如何使用 golang 将未编组的 JSON 连接到 HTML 页面?
】如何使用golang将未编组的JSON连接到HTML页面?【英文标题】:HowtoconnectJSONthatisunmarshaledtoanHTMLpageusinggolang?【发布时间】:2020-11-1406:00:38【问题描述】:我已经解组了我的JSON,我可以直接从registry.go文件打印数据。我不明白(而... 查看详情
Elasticsearch 使用 Golang Beats 返回原始 JSON
】Elasticsearch使用GolangBeats返回原始JSON【英文标题】:ElasticsearchreturnrawJSONwithGolangBeats【发布时间】:2017-03-0707:26:18【问题描述】:我正在研究我们的弹性搜索的节拍,目标是让弹性中的元素修改它们以避免重复。我已经写了一个... 查看详情
golang与json转换
参考技术Ajson是前后端交互不可缺少的数据格式生成json可以用Marshal解码json使用json.Unmarshal()函数可以对一组数据进行JSON格式的解码 查看详情
golang中使用消息名称创建protobuf消息
...息内容通过输入json文件指定 背景: 项目中使用protobuf作为rpc调用协议,计划用golang实现一个压测工具,希望能够指定messagename和json动态的构建protobuf消息;从json解析到golangprotobufmessage可以用jsonpb,这 查看详情
golang jsonrpc 调用 java json rpc
...pc将golang程序与java程序连接起来,但遇到了一些麻烦。我使用golang原生包中的“net/rpc/jsonrpc”包,以及java中的“jsonrpc4j”。我使用流模式在java中创建服务器,因为golang的json 查看详情
我们如何在golang中将json文件读取为json对象
...变量中读取它并循环遍历它以获取JSON对象值。如果我在使用ioutil.Readfile方法读取文件后使用Marshal命令,它会给出一些数字作为输出。这是我几次失败的尝试 查看详情
golang使用接口和类型断言在go中使用任意键名解析json对象(代码片段)
json库在golang中的使用
...BB,开始记录。当写个小demo或者做个小工具,没有大规模使用场景,那使用哪个库都是一样的,因为性能的体现并不会很明显。但是如果是在实际项目中使用,且伴随着高并发,大容量等场景,我还是推荐使用json-iterator。号称... 查看详情
golang使用go的net/http包对json进行编码和解码(代码片段)
带有 AMQP 的 Golang 中的 JSON RPC
...langwithAMQP【发布时间】:2019-03-2502:08:15【问题描述】:我使用“github.com/streadway/amqp”通过队列(RabbitMQ)异步处理请求。并且我使用“github.com/gorilla/rpc”注册我的服务而没有解决方法,但我必须使用丑陋的解决方案将amqp.Delivery... 查看详情
golang配置
配置使用yaml,使用了github上一个configor的库。理由如下:1.支持多种格式2.ORM,自动给变量赋值,不用写太多的代码3.但是他支持shellenv配置,我怕与运行的环境变量受影响,所以把这个功能去掉。在修改的过程中,意识到测... 查看详情
golang解析json的特殊情况处理
...被处理的JSON要全部加载到内存。如果有一个加载完的JSON使用json.Unmarshal会快一些。json.Decoder操作的是一个stream,或者其他实现了io.Reader接口的类型。意味着可以在接收或传输的同时对其进行解析。当处理一组较大数据时无需重... 查看详情
Golang 后端到 javascript JSON Parse
...NParse【发布时间】:2017-09-2620:59:26【问题描述】:我正在使用golang的gorillawebsocket库:http://www.gorillatoolkit.org/pkg/websocket这是我用来创建websocket连接的代码:conn,err:=upgrader.Upgr 查看详情
golang学习之路—json(代码片段)
...写。同时也易于机器解析和生成。JSON是在2001年开始推广使用的数据格式,目前已经成为主流的数据格式。JSON易于机器解析和生成,并有效地提升网络输出效率 查看详情