json - 从参数动态填充结构

标签 json go dynamic unmarshalling

我有以下结构,它按我得到的预期工作 数据,我能够

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)可以提供额外的数据,如电子邮件、secondName 等。但这里的大问题是 我需要从参数中获取它,因为(服务 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 中有没有很好的方法来处理它?

最佳答案

如果您事先不知道字段,则不要使用结构,而是使用同样“动态”的东西: map 。

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 值,您还可以使用 map[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]

关于json - 从参数动态填充结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53258248/

相关文章:

java - 有效的 Json 抛出 "Expected BEGIN_OBJECT but was STRING at line 1 column 4"

mongodb - 使用官方 mongo-go-driver 进行正确的通配符多字段查询

c# - 为什么 C# 编译器不会在静态方法调用实例方法的地方出现错误代码?

android - 获取 Google Play 商店应用 HTML 动态徽章

python - 如何处理 python 杂散属性赋值

javascript - 在 Node JS 中将 XML 转换为 JSON

javascript - 如何仅加载波形并等待用户单击 'play' 以在 Wavesurfer-js 上下载音频?

php - json_encode 在我的 php 中没有任何作用

web - Heroku Go Web 应用程序崩溃

golang ParseInt int8 不是无符号的