繁体   English   中英

将PSObject从JSON反序列化为C#中的列表

[英]Deserialize PSObject from JSON to a list in C#

我在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。”

我该如何解决这个问题,使其对一个元素也可以对几个元素起作用?

从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",
        ...
    }
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM