首页 > 解决方案 > 无法使用 powershell 创建正确的 json 对象

问题描述

需要通过获取规则数据来复制来自 1 个 API 的标签响应,然后使用新的标签名称发布规则数据 Initial Get response from API

    ```   {
"metadata": {
    "configurationVersions": [
        7
    ],
    "clusterVersion": "1.200.99.20200828-133130"
},
"id": "a257c448-7cbf-48cd-9cdf-a58d60ade6ef",
"name": "Billing",
"rules": [
    {
        "type": "SERVICE",
        "enabled": true,
        "valueFormat": null,
        "propagationTypes": [
            "SERVICE_TO_PROCESS_GROUP_LIKE",
            "SERVICE_TO_HOST_LIKE"
        ],
        "conditions": [
            {
                "key": {
                    "attribute": "PROCESS_GROUP_PREDEFINED_METADATA",
                    "dynamicKey": "KUBERNETES_NAMESPACE",
                    "type": "PROCESS_PREDEFINED_METADATA_KEY"
                },
                "comparisonInfo": {
                    "type": "STRING",
                    "operator": "CONTAINS",
                    "value": "billing-test",
                    "negate": false,
                    "caseSensitive": false
                }
            }
        ]
    },
    {
        "type": "SERVICE",
        "enabled": true,
        "valueFormat": null,
        "propagationTypes": [
            "SERVICE_TO_PROCESS_GROUP_LIKE",
            "SERVICE_TO_HOST_LIKE"
        ],
        "conditions": [
            {
                "key": {
                    "attribute": "PROCESS_GROUP_PREDEFINED_METADATA",
                    "dynamicKey": "KUBERNETES_NAMESPACE",
                    "type": "PROCESS_PREDEFINED_METADATA_KEY"
                },
                "comparisonInfo": {
                    "type": "STRING",
                    "operator": "CONTAINS",
                    "value": "billingservices-test",
                    "negate": false,
                    "caseSensitive": false
                }
            }
        ]
    }
]}```

我只是从上面的 api 中检索规则并删除其他属性。当我使用 post api 时,规则与上面的初始 get 响应不相似。我确定我没有正确解析 json 响应。对于如何获取条件和传播类型的前一个 json 毫无头绪。尝试创建列表和哈希表但遇到错误。

    "name":  "Billingnew",
    "rules":  [
                  {
                      "type":  "SERVICE",
                      "enabled":  true,
                      "valueFormat":  null,
                      "propagationTypes":  "SERVICE_TO_PROCESS_GROUP_LIKE SERVICE_TO_HOST_LIKE",
                      "conditions":  ""
                  },
                  {
                      "type":  "SERVICE",
                      "enabled":  true,
                      "valueFormat":  null,
                      "propagationTypes":  "SERVICE_TO_PROCESS_GROUP_LIKE SERVICE_TO_HOST_LIKE",
                      "conditions":  ""
                  }
              ]
}

下面的powershell脚本。

#param([string]$Arguments)
#$oldtagName,$newTagName=$Arguments.split(",")
#Write-Host $tagName,$userid
$oldtagName = "Billing"

$newTagName = "Bill5"
$input = "C:\Users\$userid\rules_$oldtagName.csv"
$uri="{{nonprod}}/api/config/v1/autoTags"
$url = "{{nonprod}}/api/config/v1/autoTags?"
$Tags = (Invoke-RestMethod  -Method Get -Uri $url)
#Write-Host $Tags.values
$jsonBase = @{}
foreach ( $tag in $Tags.values)
{
$tagName=$tag.name
$tagId=$tag.id
$rules = @{}

if ( $oldtagName -eq $tagName){

Write-Host $tagName,$tagId
$aurl = "{{nonprod}}/api/config/v1/autoTags/$tagId/?"
$taginfo = (Invoke-RestMethod  -Method Get -Uri $aurl) 
$tagName = $taginfo.name
 $taginfo.PSObject.Properties.Remove('metadata')
 $taginfo.PSObject.Properties.Remove('id')
 $taginfo.PSObject.Properties.Remove('name')
 $rule = $taginfo | Select-Object -Property rules
 $taginfo
 $jsonBase.add("name",$newTagName)
 $jsonBase.add("rules", $taginfo.rules)
 $jsonBase
 $data= $jsonBase | ConvertTo-Json 
   Write-Host "after" $data

}#if tag end

}#for each end

$headers = @{ Accept="application/json";Authorization="Api-Token <removed>"}

$newTagInfo = (Invoke-RestMethod $uri -Headers $headers -Method Post -Body $data  -ContentType "application/json") 
$newTagId =  $newTagInfo.id
$newTagName =  $newTagInfo.name 
Write-Host $newTagInfo.id, $newTagInfo.name

标签: jsonpowershell

解决方案


推荐阅读