Преобразовать Newtonsoft.формат JSON.В LINQ.JArray к списку определенного типа объекта
у меня есть следующая переменная типа {Newtonsoft.Json.Linq.JArray}.
properties["Value"] {[
{
"Name": "Username",
"Selected": true
},
{
"Name": "Password",
"Selected": true
}
]}
что я хочу сделать, это преобразовать это List<SelectableEnumItem> здесь SelectableEnumItem имеет следующий вид:
public class SelectableEnumItem
{
public string Name { get; set; }
public bool Selected { get; set; }
}
Я скорее не программирую, и я не уверен, возможно ли это. Любая помощь с рабочим примером будет очень признательна.
5 ответов:
просто позвони
array.ToObject<List<SelectableEnumItem>>()метод. Он вернет то, что вам нужно.документы: преобразование JSON в тип
пример в вопросе-это более простой случай, когда имена свойств точно совпадают в json и в коде. Если имена не совпадают, например, свойство в JSON-это
"first_name": "Mark"и свойство в кодеFirstNameзатем использовать выберите способ следующим образомList<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem { FirstName = (string)x["first_name"], Selected = (bool)x["selected"] }).ToList();
Я могу придумать другой метод для достижения того же
IList<SelectableEnumItem> result= array;или (у меня была какая-то ситуация, что этот не работал хорошо)
var result = (List<SelectableEnumItem>) array;или использовать расширение linq
var result = array.CastTo<List<SelectableEnumItem>>();или
var result= array.Select(x=> x).ToArray<SelectableEnumItem>();или более явно
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<string> GetJsonValues(string filePath, string propertyName) { List<string> values = new List<string>(); 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<List<string>>(); } } 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 }преобразование массива items в список клиентов было обработано, как показано здесь:
if (responseMessage.IsSuccessStatusCode) { var responseData = responseMessage.Content.ReadAsStringAsync().Result; JObject result = JObject.Parse(responseData); var clientarray = result["items"].Value<JArray>(); List<Client> clients = clientarray.ToObject<List<Client>>(); return View(clients); }
Comments