使用 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 内的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 重构 Python,知乎社区核心业务实践

Golang封装Elasticsearch常用功能

Golang封装Elasticsearch常用功能

SQLMap 源码阅读

Golang在京东列表页实践总结

golang配置