簡體   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