Преобразовать 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; } }
Я предпочитаю программировать, и я не уверен, возможно ли это. Любая помощь с рабочим примером будет принята с благодарностью.
- Как реализовать пользовательский JsonConverter в JSON.NET для десериализации списка объектов базового classа?
- В чем разница между PreserveReferencesHandling и ReferenceLoopHandling в Json.Net?
- Десериализация JSON с использованием JSon.NET с динамическими данными
- Как добавить дополнительное свойство в сериализованную строку JSON с помощью json.net?
- Каков правильный способ использования JSON.NET для анализа streamа объектов JSON?
- Deserialize json, который имеет некоторое имя свойства, начиная с числа
- json.net: указать конвертер для ключей словаря
- Дезициализация свойств самореференции не работает
- Альтернативное имя свойства при десериализации
- Могу ли я сериализовать вложенные свойства в мой class за одну операцию с помощью Json.net?
- JSON.net: как десериализовать без использования конструктора по умолчанию?
- Заставить JSON.NET включать миллисекунды при сериализации DateTime (даже если компонент ms равен нулю)
- JSON.NET: зачем использовать JToken - когда-либо?
Просто вызовите 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); }