【问题标题】:Deserialize PSObject from JSON to a list in C#将 PSObject 从 JSON 反序列化为 C# 中的列表
【发布时间】:2018-11-20 13:30:11
【问题描述】:

我有一个 C# 应用程序,可以使用 PowerShell 显示来自 Active Directory 的信息。

class userps
{
    public string Name { get; set; }
    public bool Enabled { get; set; }
}

PSObject[] results = pipeline.Invoke().ToArray();
List<userps> listUserps = new List<userps>();
foreach (PSObject obj in results)
{
     lista = JsonConvert.DeserializeObject<List<userps>>(obj.ToString());
}

如果对象返回至少两个元素的数据,例如:

[
  {
    "Name":"xxx",
    "Enabled":true
  },
  {
    "Name":"yyy",
    "Enabled":true
  }
]

那么一切都很好,List.Count = 2。但是,如果它返回一个元素:

[
  {
    "Name":"xxx",
    "Enabled":true
  }
]

那么 List.Count = 0 还有一个例外:

Newtonsoft.Json.JsonSerializationException:“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[ConsoleApp1.userps]',因为该类型需要正确反序列化的 JSON 数组(例如 [1,2,3])。
要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。
JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。
路径“名称”,第 2 行,位置 11。”

我该如何解决这个问题,使其既适用于一个元素,也适用于多个元素?

【问题讨论】:

标签: c# json powershell psobject


【解决方案1】:

看起来您从 PowerShell 命令获取的对象不是集合,而是序列化为 JSON 中的对象。当命令只返回一个对象而不是列表时,这是 PowerShell 的常见行为。

例子:

Get-Service | ConvertTo-Json

[
    {
        "Name":  "AdobeFlashPlayerUpdateSvc",
        ...
    },  
    {
        "Name":  "ALG",
        ...
    },
    ...
]

Get-Service -Name 'NetLogon' | ConvertTo-Json

{
    "Name":  "NetLogon",
    ...
}

为避免这种情况,请将您的命令封装在数组构造函数中,并用 InputObject 参数替换管道:

ConvertTo-Json -InputObject @(Get-Service -Name 'NetLogon')

[
    {
        "Name":  "NetLogon",
        ...
    }
]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2022-12-13
    • 1970-01-01
    • 2014-09-01
    相关资源
    最近更新 更多