如何捕获JSON响应中的匿名密钥并将其存储在struct中?

如何捕获JSON响应中的匿名密钥并将其存储在struct中?,json,rest,go,deserialization,glide-golang,Json,Rest,Go,Deserialization,Glide Golang,我是一个新手,一直在解压json数据。将JSON解组为作为响应返回的响应JSON的struct时遇到问题 这对内部变量的键是匿名的。因此,解组它们不会提供任何数据 Json响应如下所示 { "data": [ { "Name": "Dummy Value", "configEvents": { "5f94f412-532a-41a8-821e-6326dd

我是一个新手,一直在解压json数据。将JSON解组为作为响应返回的响应JSON的struct时遇到问题

这对内部变量的键是匿名的。因此,解组它们不会提供任何数据

Json响应如下所示

{
  "data": [
    {
      "Name": "Dummy Value",
      "configEvents": {
        "5f94f412-532a-41a8-821e-6326dd72556b": {
          "eventId": "dummy",
          "start": "dummy",
          "end": "dummy",
          "details": {
            "providerCallSign": "dummy",
            "callSign": "dummy"
          }
        }
      },
      "policyEvents": {
        "930195be-f409-421c-abe2-a39d2450d669": {
          "details": {
            "daiMobileFlag": false
          }
        }
      }
    }
  ]
}
type Response struct {
    Data []struct {
        Name         string `json:"Name"`
        ConfigEvents struct {
            FiveF94F412532A41A8821E6326Dd72556B struct {
                EventID string `json:"eventId"`
                Start   string `json:"start"`
                End     string `json:"end"`
                Details struct {
                    ProviderCallSign string `json:"providerCallSign"`
                    CallSign         string `json:"callSign"`
                } `json:"details"`
            } `json:"5f94f412-532a-41a8-821e-6326dd72556b"`
        } `json:"configEvents"`
        PolicyEvents struct {
            Nine30195BeF409421CAbe2A39D2450D669 struct {
                Details struct {
                    DaiMobileFlag bool `json:"daiMobileFlag"`
                } `json:"details"`
            } `json:"930195be-f409-421c-abe2-a39d2450d669"`
        } `json:"policyEvents"`
    } `json:"data"`
}
我的结构如下所示

{
  "data": [
    {
      "Name": "Dummy Value",
      "configEvents": {
        "5f94f412-532a-41a8-821e-6326dd72556b": {
          "eventId": "dummy",
          "start": "dummy",
          "end": "dummy",
          "details": {
            "providerCallSign": "dummy",
            "callSign": "dummy"
          }
        }
      },
      "policyEvents": {
        "930195be-f409-421c-abe2-a39d2450d669": {
          "details": {
            "daiMobileFlag": false
          }
        }
      }
    }
  ]
}
type Response struct {
    Data []struct {
        Name         string `json:"Name"`
        ConfigEvents struct {
            FiveF94F412532A41A8821E6326Dd72556B struct {
                EventID string `json:"eventId"`
                Start   string `json:"start"`
                End     string `json:"end"`
                Details struct {
                    ProviderCallSign string `json:"providerCallSign"`
                    CallSign         string `json:"callSign"`
                } `json:"details"`
            } `json:"5f94f412-532a-41a8-821e-6326dd72556b"`
        } `json:"configEvents"`
        PolicyEvents struct {
            Nine30195BeF409421CAbe2A39D2450D669 struct {
                Details struct {
                    DaiMobileFlag bool `json:"daiMobileFlag"`
                } `json:"details"`
            } `json:"930195be-f409-421c-abe2-a39d2450d669"`
        } `json:"policyEvents"`
    } `json:"data"`
}

由于键在响应中是动态的,所以解组不会捕获该特定对象。有没有办法在goLang中处理这种情况。

我将json修改为类似的格式

    {
  "data": [
    {
      "Name": "Dummy Value",
      "configEvents": {
        "5f94f412-532a-41a8-821e-6326dd72556b": {
          "eventId": "dummy",
          "start": "dummy",
          "end": "dummy",
          "details": {
            "providerCallSign": "dummy",
            "callSign": "dummy"
          }
        }
      },
      "policyEvents": {
        "930195be-f409-421c-abe2-a39d2450d669": {
          "details": {
            "daiMobileFlag": false
          }
        }
      }
    }
  ]
}
然后这段代码就可以接收它

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

type insideConfigEvents struct {
    EventID string `json:"eventId"`
    Start   string `json:"start"`
    End     string `json:"end"`
    Details struct {
        ProviderCallSign string `json:"providerCallSign"`
        CallSign         string `json:"callSign"`
    } `json:"details"`
}

type insidePolicyEvents struct {
    Details struct {
        DaiMobileFlag bool `json:"daiMobileFlag"`
    } `json:"details"`
}

type Input struct {
    Data []struct {
        Name         string                        `json:"Name"`
        ConfigEvents map[string]insideConfigEvents `json:"configEvents"`
        PolicyEvents map[string]insidePolicyEvents `json:"policyEvents"`
    } `json:"data"`
}

func main() {
    var dat Input
    b, err := ioutil.ReadFile("inv.json") // just pass the file name
    if err != nil {
        fmt.Print(err)
    }
    if err := json.Unmarshal(b, &dat); err != nil {
        panic(err)
    }
    fmt.Println(dat.Data[0].ConfigEvents)
}

你说“钥匙是匿名的”是什么意思?关键点总是有一个值。如果钥匙不是静态的,你就使用
地图
。回答你的问题了吗?@TejasGhonge:同样,如果钥匙事先不是静态的,你就需要使用地图。不能在运行时动态更改结构字段。Cu@TejasGhonge您不需要再次解析映射。使用映射类型而不是键是动态的结构类型。注意,如果使用命名类型而不是匿名结构,则编写维护将更容易。这样,它就像
map[string]configEvent
。感谢您提供此解决方案。非常感谢!!