Десериализовать PSObject из JSON в список в C # - PullRequest
0 голосов
/ 11 июня 2018

У меня есть приложение на C # для отображения информации из Active Directory с помощью PowerShell.

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 ».

Как решить эту проблему, чтобы она работала для одного элемента, а также для нескольких?

1 Ответ

0 голосов
/ 11 июня 2018

Похоже, что объект, который вы получаете из команды 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",
        ...
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...