Преобразовать Newtonsoft.Json.Linq.JArray в список определенного типа объекта

У меня есть следующая переменная типа {Newtonsoft.Json.Linq.JArray} .

 properties["Value"] {[ { "Name": "Username", "Selected": true }, { "Name": "Password", "Selected": true } ]} 

Я хочу выполнить преобразование в List где SelectableEnumItem имеет следующий тип:

 public class SelectableEnumItem { public string Name { get; set; } public bool Selected { get; set; } } 

Я предпочитаю программировать, и я не уверен, возможно ли это. Любая помощь с рабочим примером будет принята с благодарностью.

Просто вызовите array.ToObject>() . Он вернет вам то, что вам нужно.

Документация: конвертировать JSON в тип

Пример в вопросе – это более простой случай, когда имена свойств совпадают точно в json и в коде. Если имена свойств точно не совпадают, например, свойство в json является "first_name": "Mark" а свойство в коде – FirstName затем используйте метод Select следующим образом

 List items = ((JArray)array).Select(x => new SelectableEnumItem { FirstName = (string)x["first_name"], Selected = (bool)x["selected"] }).ToList(); 

Я могу думать о другом методе для достижения того же

 IList result= array; 

или (у меня была какая-то ситуация, когда эта работа не срабатывала)

 var result = (List) array; 

или использовать расширение linq

 var result = array.CastTo>(); 

или

 var result= array.Select(x=> x).ToArray(); 

или более эксплицитно

 var result= array.Select(x=> new SelectableEnumItem{FirstName= x.Name, Selected = bool.Parse(x.selected) }); 

обратите внимание на приведенное выше решение. Я использовал динамический объект

Я могу придумать еще несколько решений, которые представляют собой комбинации вышеупомянутых решений. но я думаю, что он охватывает почти все доступные методы.

Я сам использую первый

 using Newtonsoft.Json.Linq; using System.Linq; using System.IO; using System.Collections.Generic; public List GetJsonValues(string filePath, string propertyName) { List values = new List(); string read = string.Empty; using (StreamReader r = new StreamReader(filePath)) { var json = r.ReadToEnd(); var jObj = JObject.Parse(json); foreach (var j in jObj.Properties()) { if (j.Name.Equals(propertyName)) { var value = jObj[j.Name] as JArray; return values = value.ToObject>(); } } return values; } } 

Возвращаемое значение API в моем случае, как показано ниже:

 { "pageIndex": 1, "pageSize": 10, "totalCount": 1, "totalPageCount": 1, "items": [ { "firstName": "Stephen", "otherNames": "Ebichondo", "phoneNumber": "+254721250736", "gender": 0, "clientStatus": 0, "dateOfBirth": "1979-08-16T00:00:00", "nationalID": "21734397", "emailAddress": "[email protected]", "id": 1, "addedDate": "2018-02-02T00:00:00", "modifiedDate": "2018-02-02T00:00:00" } ], "hasPreviousPage": false, "hasNextPage": false } 

Преобразование массива элементов в список клиентов обрабатывалось, как показано здесь:

  if (responseMessage.IsSuccessStatusCode) { var responseData = responseMessage.Content.ReadAsStringAsync().Result; JObject result = JObject.Parse(responseData); var clientarray = result["items"].Value(); List clients = clientarray.ToObject>(); return View(clients); } 
  • Ошибка десериализации Newtonsoft JSON.net, где поля в порядке изменения JSON
  • Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1
  • Создайте строго типизированный объект c # из объекта json с ID как имя
  • Интерфейсы для десериализации в JSON.NET
  • Как преобразовать массив Json в список объектов в c #
  • Как сообщить Json.Net глобально применить StringEnumConverter ко всем enumsм
  • Порядок сериализованных полей с использованием JSON.NET
  • Отключить classы JSON до C #
  • Можете ли вы определить, был ли объект, десериализованный объект, отсутствием поля с classом JsonConvert в Json.NET
  • Невозможно сериализовать словарь с помощью сложного ключа с помощью Json.net
  • Как изменить имена свойств при сериализации с помощью Json.net?
  • Давайте будем гением компьютера.