我在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对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。 路径'名称',第2行,第11位。“
如何解决问题,它适用于一个元素,也适用于几个元素?
答案 0 :(得分:2)
看起来您从PowerShell Command获取的对象不是集合,而是在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",
...
}
]