【问题标题】:Replace keys with dynamic values in JSON用 JSON 中的动态值替换键
【发布时间】:2020-03-14 13:30:59
【问题描述】:

在下面的 JSON 中,我想将 KEYS xyz 和 abc 替换为我通过以下语句从表单中获得的联盟和 env 的动态值,用下面的直接对象名称替换引号中的单词 abc 给了我一个错误。有什么方法可以实现吗?

var env = g_form.getValue('vpc_environment_type');
var alliance = g_form.getValue('alliance_business_unit');
var team = g_form.getVal`enter code here`ue('alliance_segment_team_name_df_ingestion');
var project = g_form.getValue('project_name_gcp_df_ingestion_npe');

var requestBody =   {
  "format_version": "0.2.19",
  "alliances": {
    "xyz": {
      "environments": {
        "abc": {
          "teams": {
            "dna": {
              "action": "edit",
              "team": "dna",
              "projects": {
                "xxxx": {
                  "project": "xxxxx",
                  "cost_center": "0",
                  "custom_iam_policies": [],
                  "iam": {
                    "dev_group_email_name": "123",
                    "view_group_email_name": "456",
                    "sre_admin_group_email_name": "789"
                  },
                  "allowed_apis": [
                    "123",
                    "123"
                  ],
                  "networks": {
                    "xxxxx": {
                      "flags": [
                        "VM"
                      ],
                      "region": "123,
                      "preferred-suffix" : "123"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
};

requestBody = new global.JSON().encode(requestBody);
console.log(requestBody);

【问题讨论】:

  • stackoverflow.com/questions/3153969/… 这样的事情可能吗?我不想替换任何东西,我希望从一开始就是这样,我发布的 JSON 是一个示例,我想用变量替换一些键,以便我可以为每个提交的表单获取不同的 JSON 有效负载用户。

标签: javascript json servicenow


【解决方案1】:

试试这样的。请注意,您不能只重命名 JavaScript 对象中的键,您需要添加具有新名称的新键并在不需要时删除旧键。另请注意,当您删除旧键时,如果数据发生突变,您可能会删除新键中的值。

var alliance = g_form.getValue('alliance_business_unit');
requestBody.alliances[alliance] =  requestBody.alliances.xyz;

这将使用从g_form.getValue('alliance_business_unit');返回的密钥名称在联盟下添加新密钥

对 env 也一样。

动态赋值是这样完成的

object[variable] = value; 

如果你的变量有值测试,你就会有这样的对象

{test: 'your value' }

【讨论】:

  • stackoverflow.com/questions/3153969/… 这样的事情可能吗?我不想替换任何东西,我希望从一开始就是这样,我发布的 JSON 是一个示例,我想用变量替换一些键,以便我可以为每个提交的表单获取不同的 JSON 有效负载用户。
  • object[variable] = value; // 如果你的变量有值测试,你就会有这样的对象{test: 'your value' }
  • 我很困惑 requestBody.alliances[alliance] = requestBody.alliances.xyz;不应该反过来吗?我们不是用可变联盟代替xyz吗?你能解释一下吗?
  • 这就是将 xyz 中的现有值分配给新创建的键。
【解决方案2】:

字符串化 > 替换 > 转换为 JSON

您需要用您想要的键替换字符串:Dynamic1Dynamic2

requestBody = JSON.parse(JSON.stringify(requestBody).replace("\"xyz\"","\"Dynamic1\"").replace("\"abc\"","\"Dynamic2\""));

更新: 您可以通过这种方式将变量用作键。

var newKey1 = "DynamicKey1";
requestBody.alliances[newKey1] = requestBody.alliances.xyz;

var newKey2 = "DynamicKey2";
requestBody.alliances[newKey1].environments[newKey2] = requestBody.alliances[newKey1].environments.abc;

【讨论】:

  • stackoverflow.com/questions/3153969/… 这样的事情可能吗?我不想替换任何东西,我希望从一开始就是这样,我发布的 JSON 是一个示例,我想用变量替换一些键,以便我可以为每个提交的表单获取不同的 JSON 有效负载用户。
  • 查看更新的答案
猜你喜欢
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多