首页 > 解决方案 > 尝试将 JSON 反序列化为 Powershell 中的类型化对象

问题描述

我正在尝试将 JSON 字符串(来自 API 响应)反序列化为我在 Powershell 中键入的对象,但是,我不断收到两种类型的错误。

我有两个 PowerShell 类,例如:

cpublic class DataType
{
    [string] key
    [string] dataName
}

public class DataTypeList
{
    [string] key 
    [string] name 
    [string] localeKey 
}

public class Event
{
    [string] key
    [string] name
    [string] localeKey
    [DataType] DataType
    [List[DataTypeList]] DataTypeList
}

public class Root
{
   [List[Event]] $events
}

我的 JSON 响应如下所示:

  {
   "Events":[
      {
         "key":"1234",
         "name":"Bob Muprhy",
         "localeKey":"4",
         "DataType":{
            "key":"1111111",
            "dataName":"Name One"
         },
         "DataTypeList":[
            {
               "key":"983984",
               "name":"New name",
               "localeKey":"34985"
            },
            {
               "key":"124543534",
               "name":"New name new Name",
               "localeKey":"asdfsadf"
            }
         ]
      },
      {
         "key":"123456567",
         "name":"Pete big",
         "localeKey":"4",
         "DataType":{
            "key":"1111111",
            "dataName":"Name 1"
         },
         "DataTypeList":[
            {
               "key":"983984",
               "name":"New name",
               "localeKey":"34985"
            },
            {
               "key":"124543534",
               "name":"New name new Name",
               "localeKey":"asdfsadf"
            }
         ]
      }
   ]
}

我的代码目前看起来像这样,我正在使用 Invoke-RestMethod,因为我已经读过它会自动将 ConvertFrom-JSON 应用于 API 响应/内容

在这里,我得到了 json 响应:

$json = Invoke-RestMethod -Uri "<API Link>"

在这里,我试图通过使用 Cast-Initialization 技术“将 JSON 反序列化到我的对象中”

$response = [Root]($json)

但是我会收到一条错误响应:无法创建“根”类型的对象。无法将类型“System.Object[]”的“System.Object[]”值转换为类型“System.Collections.Generic.List`1[FeaturedEvent]

我也尝试做类似的事情:

$response = [Root]($json.Events)

但是,这也会返回错误无法将“System.Object[]”类型的“System.Object[]”值转换为“Root”类型

在 C# 中反序列化某些东西时,我知道我可以做类似的事情

*JsonConvert.DeserializeObject<Root>(json);*

尝试在 Powershell 中复制相同的内容

我也试过这个:

 $root = [Root]::new()

 $root.Events = $json.Events

但是我又收到了同样的错误

标签: powershell

解决方案


您的数据类型有错误。公共类DataTypeList应该只有根据$json有[DataType[]]$DataTypeList。这应该将您的 json 反序列化为自定义 [Root] 类型:

class DataType {
    [string]$key;
    [string]$dataName;
}

 class DataTypeList {
    [DataType[]]$DataTypeList;
}

class Event {
    [string]$key;
    [string]$name;
    [string]$localeKey;
    [DataType]$DataType;
    [Collections.Generic.List[DataTypeList]]$DataTypeList;
}

class Root {
   [Collections.Generic.List[Event]]$events;
}

$content = ([System.Web.Script.Serialization.JavaScriptSerializer]::new()).Deserialize($json, [Root])

推荐阅读