为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 golang 中使用动态/任意字段创建结构/模型

如何在 golang 中使用动态/任意字段创建结构/模型

Go
MYYA 2022-06-27 15:28:39
是否可以创建具有动态/任意字段和值的结构?我的应用程序将收到带有 JSON 正文的请求:{"Details": {  "Id": “123”, },"Event": {  "Event": "Event", },“RequestValues”: [  {    “Name": "Name1",    "Value": "Val1"  },  {    "Name": "Name2",    "Value": 2  },  {    "Name": “Foo”,    "Value": true  }    ]  }这将被解组到我的模型“请求”:type Request struct {    Details         Details          `json:"Details"`    Event           Event            `json:"Event"`    RequestValues []RequestValues    `json:"RequestValues"`}type Details struct {    Id     string `json:"Id"`}type Event struct {    Event      string `json:"Event"`}type RequestValues struct {    Name  string `json:"Name"`    Value string `json:"Value"`}我必须将模型“请求”重新映射到“值”中具有任意字段的新模型“事件”。在编组新的重新映射模型“事件”后,我应该得到与请求对应的 JSON 输出:{"Event": "Event""Values": {  “Id": "123",      <= non arbitrary mapping from Request.Detail.Id  "Name1": "Val1",  <= arbitrary   "Name2": 2,       <= arbitrary  “Foo”: true       <= arbitrary}}任意值将从“RequestValues”映射。这些字段的名称应该是 Request.RequestValues.Name 的值,它们的值应该是 Request.RequestValues.Value 的值这是我的“事件”模型:type Event struct {    Event             string `json:"Event"`    Values            Values `json:"Values"`}type Values struct{    Id      string  `json:"Id"`}
查看完整描述

2 回答

?
青春有我

TA贡献1784条经验 获得超8个赞

首先,这是您的 JSON 的 JSON 有效副本:


{

    "Details": {

        "Id": "123"

    },

    "Event": {

        "Event": "Event"

    },

    "RequestValues": [

        {

            "RequestValueName": "Name1",

            "RequestValue": "Val1"

        },

        {

            "RequestValueName": "Name2",

            "RequestValue": 2

        },

        {

            "RequestValueName": "Foo",

            "RequestValue": true

        }

    ]

}

首先创建一个type Input struct{}来描述您要解析type Output struct{}的 JSON,并为您要生成的 JSON 创建一个,然后编写一些代码以从一个转换为另一个。您不必立即添加所有字段 - 您可以从Event示例开始,然后添加更多字段,直到全部完成。


我已经在https://play.golang.org/p/PvpKnFMrJjN中向您展示了这一点,但我建议您先快速阅读一下,然后再尝试自己重新创建它。


将 JSON 转换为 Go 结构的有用工具是https://mholt.github.io/json-to-go/,但它会RequestValue在您的示例中出现,该示例具有多种数据类型(因此是我们使用的地方interface{})。


查看完整回答
反对 回复 2022-06-27
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

我认为您可以像这样使用地图:


package main


import (

    "fmt"

)


type Event struct {

    event  string

    values map[string]string

}


func main() {

    eventVar := Event{event: "event", values: map[string]string{}}

    eventVar.values["Id"] = "12345"

    eventVar.values["vale1"] = "value"

    fmt.Println(eventVar)

}

您只需要以某种方式验证它在其中的 id,如果您需要同一级别的值。


我希望这对你有用。


查看完整回答
反对 回复 2022-06-27
  • 2 回答
  • 0 关注
  • 395 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信