使用 Golang 重构 Json

     2023-03-29     234

关键词:

【中文标题】使用 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 内的PostIdType 的值

【讨论】:

这样做时不起作用: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易于机器解析和生成,并有效地提升网络输出效率&# 查看详情