【问题标题】:Add new key value pairs for json using powershell使用 powershell 为 json 添加新的键值对
【发布时间】:2018-11-13 16:09:21
【问题描述】:

我正在创建一个 arm 模板以在 ADF 中部署数据集,为此我需要根据我的输入文件使用新的键值对更新现有的 json 文件。如何使用 powershell 将新的键值对添加到 json 文件。 对此的任何帮助都非常感谢..

如果使用“Add-Member”,它将为结构中的所有属性更新新的“键”和“值”,如下所示。但我希望在另一个值对之后添加新的键和值,就像我展示的那样在下面用“需要添加这个”突出显示的代码中

                {
                    "name": "VIN",
                    "type": "String"
                    "newkey1" : "newvalue1"
                    "newkey2" : "newvalue2"
                },
                {
                    "name": "MAKE",
                    "type": "String"
                     "newkey1" : "newvalue1"
                    "newkey2" : "newvalue2"

                },

我的代码应该看起来像这样。“需要添加这个”是我打算在每个循环中添加的键值对,只要我有来自另一个文本文件的输入。

    {
        "name": "[concat(parameters('factoryName'), '/Veh_Obj')]",
        "type": "Microsoft.DataFactory/factories/datasets",
        "apiVersion": "2018-06-01",
        "properties": {
            "linkedServiceName": {
                "referenceName": "AzureDataLakeStore1",
                "type": "LinkedServiceReference"
            },
            "annotations": [],
            "type": "AzureDataLakeStoreFile",
            "structure": [
                {
                    "name": "VIN",
                    "type": "String"
                },
                {
                    "name": "MAKE",
                    "type": "String"
                },
                {
                    "Need to add this": "Need to add this",
                    "Need to add this": "Need to add this"
                },
                {
                    "Need to add this": "Need to add this",
                    "Need to add this": "Need to add this"
                },
                {
                    "Need to add this": "Need to add this",
                    "Need to add this": "Need to add this"
                },
                {
                    "Need to add this": "Need to add this",
                    "Need to add this": "Need to add this"
                }

            ],
            "typeProperties": {
                "format": {
                    "type": "TextFormat",
                    "columnDelimiter": "|",
                    "rowDelimiter": "\n",
                    "quoteChar": "\"",
                    "nullValue": "\"\"",
                    "encodingName": null,
                    "treatEmptyAsNull": true,
                    "skipLineCount": 0,
                    "firstRowAsHeader": false
                },
                "fileName": "[parameters('Veh_Obj_properties_typeProperties_fileName')]",
                "folderPath": "[parameters('Veh_Obj_properties_typeProperties_folderPath')]"
            }
        },
        "dependsOn": [
            "[concat(variables('factoryId'), '/linkedServices/AzureDataLakeStore1')]"
        ]
    },

【问题讨论】:

    标签: json powershell arm-template


    【解决方案1】:

    您不需要Add-Member,您只需“追加”到.properties.structure 中的现有数组(从技术上讲,您正在创建一个包含新元素的新数组)。

    这是一个简化的例子:

    # Sample JSON.
    $json = @'
    {
        "name": "[concat(parameters('factoryName'), '/Veh_Obj')]",
        "properties": {
            "type": "AzureDataLakeStoreFile",
            "structure": [
                {
                    "name": "VIN",
                    "type": "String"
                },
                {
                    "name": "MAKE",
                    "type": "String"
                }
            ],
        }
    }
    '@
    
    # Convert from JSON to a nested custom object.
    $obj = $json | ConvertFrom-Json
    
    # Append new objects to the array.
    $obj.properties.structure += [pscustomobject] @{ name = 'newname1' },
                                 [pscustomobject] @{ name = 'newname2' }
    
    # Convert back to JSON.
    $obj | ConvertTo-Json -Depth 3
    

    以上产出:

    {
      "name": "[concat(parameters('factoryName'), '/Veh_Obj')]",
      "properties": {
        "type": "AzureDataLakeStoreFile",
        "structure": [
          {
            "name": "VIN",
            "type": "String"
          },
          {
            "name": "MAKE",
            "type": "String"
          },
          {
            "name": "newname1"
          },
          {
            "name": "newname2"
          }
        ]
      }
    }
    

    【讨论】:

      【解决方案2】:
      $CompanyJSON = @"
      {
          "name": "[concat(parameters('factoryName'), '/Veh_Obj')]",
          "type": "Microsoft.DataFactory/factories/datasets",
          "apiVersion": "2018-06-01",
          "properties": {
              "linkedServiceName": {
                  "referenceName": "AzureDataLakeStore1",
                  "type": "LinkedServiceReference"
              },
              "annotations": [],
              "type": "AzureDataLakeStoreFile",
              "structure": [
                  {
                      "name": "VIN",
                      "type": "String"
                  },
                  {
                      "name": "MAKE",
                      "type": "String"
                  }
      
              ],
              "typeProperties": {
                  "format": {
                      "type": "TextFormat",
                      "columnDelimiter": "|",
                      "rowDelimiter": "\n",
                      "quoteChar": "\"",
                      "nullValue": "\"\"",
                      "encodingName": null,
                      "treatEmptyAsNull": true,
                      "skipLineCount": 0,
                      "firstRowAsHeader": false
                  },
                  "fileName": "[parameters('Veh_Obj_properties_typeProperties_fileName')]",
                  "folderPath": "[parameters('Veh_Obj_properties_typeProperties_folderPath')]"
              }
          },
          "dependsOn": [
              "[concat(variables('factoryId'), '/linkedServices/AzureDataLakeStore1')]"
          ]
      }
      "@
      $AddArray = @('' +
      '{' +
      '    "name": "VIN",' +
      '    "type": "String",' +
      '    "newkey1": "newvalue1",' +
      '    "newkey2": "newvalue2"' +
      '}';
      '{' +
      '    "name": "MAKE",' +
      '    "type": "String",' +
      '    "newkey1": "newvalue1",' +
      '    "newkey2": "newvalue2"' +
      '}'
      )
      Add-Type -AssemblyName System.Web.Extensions;
      $json = [System.Web.Script.Serialization.JavaScriptSerializer]::new();
      $json.MaxJsonLength = 2147483647; #max integer or less
      $CompanyObj=$json.Deserialize($CompanyJSON, [System.Object]);
      foreach ($chank in $AddArray){
          $CompanyObj.properties.structure+=$json.Deserialize($chank, [System.Object]);
      }
      $CompanyJSON=$json.Serialize($CompanyObj);
      Write-Host $CompanyJSON
      

      您会看到 \u0027 等。它是 unicode。 JSON 会理解的。

      【讨论】:

        猜你喜欢
        • 2020-04-26
        • 2018-01-25
        • 1970-01-01
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 2019-04-02
        • 1970-01-01
        • 2021-11-22
        相关资源
        最近更新 更多