json - 从参数动态填充结构
问题描述
我有以下结构按预期工作我正在获取数据并且我能够
type Service struct {
Resources []struct {
Model struct {
Name string `json:"name"`
Credentials struct {
path string `json:"path"`
Vts struct {
user string `json:"user"`
id string `json:"id"`
address string `json:"address"`
} `json:"vts"`
} `json:"credentials"`
} `json:"model"`
} `json:"resources"`
}
service:= Service{}
err := json.Unmarshal([]byte(data), &service
数据如下,
服务1
{
"resources": [
"model": {
"name": "cred",
"credentials": {
"path": "path in fs",
"vts": {
"user": "stephane",
"id": "123",
"address": "some address"
}
},
}
},
现在一些服务在 vts 下提供附加数据,例如现在我们有 3 个字段(用户/ID/地址),但一些服务(服务 1)可以提供附加数据,如电子邮件、秒名等。但这里最大的问题是我需要从参数中获取它,因为(服务 2)教育、薪水等
服务2
{
"resources": [
"model": {
"name": "cred",
"credentials": {
"path": "path in fs",
"vts": {
"user": "stephane",
"id": "123",
"address": "some address",
"email" : "some email",
"secondName" : "secondName"
}
},
}
},
服务 N
{
"resources": [
"model": {
"name": "cred",
"credentials": {
"path": "path in fs",
"vts": {
"user": "stephane",
"id": "123",
"address": "some address",
"salary" : "1000000"
}
},
}
},
当然,如果我事先知道字段,我可以将它们全部放入结构中并使用omitempty
,但我不知道,我只是将它作为函数的参数(新属性名称),一些服务可以在这个结构中提供 10 个以上的字段(我应该得到它们args[]
关于函数的属性名称)但我事先不知道它们,这应该是动态的......在 Golang 中是否有一种很好的方法来处理它?
解决方案
如果您事先不知道这些字段,那么不要使用结构,而是使用同样“动态”的东西:映射。
type Service struct {
Resources []struct {
Model struct {
Name string `json:"name"`
Credentials struct {
Path string `json:"path"`
Vts map[string]interface{} `json:"vts"`
} `json:"credentials"`
} `json:"model"`
} `json:"resources"`
}
map[sting]interface{}
可以保存任何类型的值。如果您知道所有字段都将保存一个string
值,您也可以使用 amap[string]string
以便更容易使用它。
输入 JSON 示例:
{
"resources": [
{
"model": {
"name": "cred",
"credentials": {
"path": "path in fs",
"vts": {
"user": "stephane",
"id": "123",
"address": "some address",
"dyn1": "d1value",
"dyn2": "d2value"
}
}
}
}
]
}
测试它:
service := Service{}
err := json.Unmarshal([]byte(data), &service)
fmt.Printf("%q %v", service, err)
输出(在Go Playground上试试):
{[{{"cred" {"path in fs" map["dyn2":"d2value" "user":"stephane" "id":"123"
"address":"some address" "dyn1":"d1value"]}}}]} <nil>
现在,如果您想从Vts
映射中收集一组键的值,您可以这样做:
args := []string{"dyn1", "dyn2"}
values := make([]interface{}, len(args))
for i, arg := range args {
values[i] = service.Resources[0].Model.Credentials.Vts[arg]
}
fmt.Println(values)
上面的输出将是(在Go Playground上尝试):
[d1value d2value]
推荐阅读
- python-3.x - TypeError:将列表转换为元组作为返回值时,“元组”对象不可调用
- tsql - TSQL - 选择具有相同 IS 的值
- dataframe - 如果组存在于数据框中使用 groupby.getgroup
- typescript - 如何在 TypeScript 的树状类型定义的所有级别中添加相同的属性?
- java - 为什么 Java 中的断言充当“缺少的返回语句”而 throw 语句却没有?
- shell - 使用相同矩阵配置运行的 Github Actions 作业
- php - Magento 1.9 的捆绑产品缺少产品图像
- python - 将新行追加到 DF
- python - 高斯分布的两个 Y 轴以及如何为分布着色
- javascript - 如何以相同的顺序将 orderBy 方法中的项目推送到 Firestore 数据库?