猿问

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

是否可以创建具有动态/任意字段和值的结构?


我的应用程序将收到带有 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"`

}


MYYA
浏览 396回答 2
2回答

青春有我

首先,这是您的 JSON 的 JSON 有效副本:{&nbsp; &nbsp; "Details": {&nbsp; &nbsp; &nbsp; &nbsp; "Id": "123"&nbsp; &nbsp; },&nbsp; &nbsp; "Event": {&nbsp; &nbsp; &nbsp; &nbsp; "Event": "Event"&nbsp; &nbsp; },&nbsp; &nbsp; "RequestValues": [&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "RequestValueName": "Name1",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "RequestValue": "Val1"&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "RequestValueName": "Name2",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "RequestValue": 2&nbsp; &nbsp; &nbsp; &nbsp; },&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "RequestValueName": "Foo",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "RequestValue": true&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; ]}首先创建一个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{})。

红糖糍粑

我认为您可以像这样使用地图:package mainimport (&nbsp; &nbsp; "fmt")type Event struct {&nbsp; &nbsp; event&nbsp; string&nbsp; &nbsp; values map[string]string}func main() {&nbsp; &nbsp; eventVar := Event{event: "event", values: map[string]string{}}&nbsp; &nbsp; eventVar.values["Id"] = "12345"&nbsp; &nbsp; eventVar.values["vale1"] = "value"&nbsp; &nbsp; fmt.Println(eventVar)}您只需要以某种方式验证它在其中的 id,如果您需要同一级别的值。我希望这对你有用。
随时随地看视频慕课网APP

相关分类

Go
我要回答