首页 > 解决方案 > ConvertTo-JSON 插入调试信息

问题描述

在准备用于Invoke-RestMethod调用的正文数据时,我创建了一个 PSCustomObject 以将其转换为 JSON - 这样的好处是允许我以清晰简洁的方式创建我的数据对象,然后ConvertTo-JSON为我处理 JSON 格式.

无论如何,我注意到一个对象特别容易出现问题,因为 Powershell(或底层 .NET 类?)正在将似乎​​是调试信息的内容插入到生成的 JSON 对象中。

PSCustomObject 代码

    $importCommitBodyObj = [PSCustomObject]@{
        delete_after_import        = "0"
        file_description           = $null
        file_title                 = $null
        import_source              = @{name="Me"; status=@{name="Shareable"}}
        file_type                  = "6"
        global_status              = "1"
        apply_attributes           = {@{name="Family"; value="Smith"; sources={@{name="Me"; status=@{name="Shareable"}}}}}
    }

在控制台中查看的 PSCustomObject

PS C:\> $importCommitBodyObj


delete_after_import : 0
file_description    : 
file_title          : 
import_source       : {name, status}
file_type           : 6
global_status       : 1
apply_attributes    : @{name="Family"; value="Smith"; sources={@{name="Me"; status=@{name="Shareable"}}}}

转换为 JSON 后的对象

PS C:\> $importCommitBodyObj | ConvertTo-Json
{
    "delete_after_import":  "0",
    "file_description":  null,
    "file_title":  null,
    "import_source":  {
                          "name":  "Me",
                          "status":  {
                                         "name":  "Shareable"
                                     }
                      },
    "file_type":  "6",
    "global_status":  "1",
    "apply_attributes":  {
                             "Attributes":  [

                                            ],
                             "File":  null,
                             "IsFilter":  false,
                             "IsConfiguration":  false,
                             "Module":  null,
                             "StartPosition":  {
                                                   "Content":  "{@{name=\"Family\"; value=\"Smith\"; sources={@{name=\"Me\"; status=@{name=\"Shareable\"}}}}}",
                                                   "Type":  19,
                                                   "Start":  377,
                                                   "Length":  85,
                                                   "StartLine":  8,
                                                   "StartColumn":  38,
                                                   "EndLine":  8,
                                                   "EndColumn":  123
                                               },
                             "DebuggerHidden":  false,
                             "Id":  "0fae92d5-6e02-472c-b040-a6bcbb495c6d",
                             "Ast":  {
                                         "Attributes":  "",
                                         "UsingStatements":  "",
                                         "ParamBlock":  null,
                                         "BeginBlock":  null,
                                         "ProcessBlock":  null,
                                         "EndBlock":  "@{name=\"Family\"; value=\"Smith\"; sources={@{name=\"Me\"; status=@{name=\"Shareable\"}}}}",
                                         "DynamicParamBlock":  null,
                                         "ScriptRequirements":  null,
                                         "Extent":  "{@{name=\"Family\"; value=\"Smith\"; sources={@{name=\"Me\"; status=@{name=\"Shareable\"}}}}}",
                                         "Parent":  "{@{name=\"Family\"; value=\"Smith\"; sources={@{name=\"Me\"; status=@{name=\"Shareable\"}}}}}"
                                     }
                         }
}

我期望输出的样子

{
  "delete_after_import": 0,
  "file_description": null,
  "file_title": null,
  "import_source": {
    "name": "Me",
    "status": {
      "name": "Shareable"
    }
  },
  "file_type": 6,
  "global_status": 1,
  "apply_attributes": [
    {
      "name": "Family",
      "value": "Smith",
      "sources": [
        {
          "name": "Me",
          "status": {
            "name": "Shareable"
          }
        }
      ]
    }
  ]
}

我从来没有见过ConvertTo-JSON做这样的事情。有谁知道发生了什么,以及我如何解决它?

标签: jsonpowershell

解决方案


要获得正确的格式:@(...)用于要转换为 JSON 数组的项目。

其次,您必须-Depth使用ConvertTo-Json. 默认情况下ConvertTo-Json只进入 2 个级别。这就是为什么你会得到奇怪的结果。它返回对象类型(即x.ToString()),而不是按预期枚举对象的其余部分。所以得到你想要的更新代码是:

$importCommitBodyObj = [PSCustomObject]@{
        delete_after_import        = "0"
        file_description           = $null
        file_title                 = $null
        import_source              = @{name="Me"; status=@{name="Shareable"}}
        file_type                  = "6"
        global_status              = "1"
        apply_attributes           = @(@{name="Family"; value="Smith"; sources=@(@{name="Me"; status=@{name="Shareable"}})})
    }  

$importCommitBodyObj | ConvertTo-Json -Depth 10

推荐阅读