Ответ 1
Просто вызовите метод array.ToObject<List<SelectableEnumItem>>()
. Он вернет вам то, что вам нужно.
Документация: Преобразование JSON в тип
У меня есть следующая переменная типа {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; }
}
Я новичок в программировании, и я не уверен, возможно ли это. Любая помощь с рабочим примером будет принята с благодарностью.
Просто вызовите метод 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();
Возвращаемое значение 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);
}
Я могу думать о другом методе для достижения того же
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;
}
}
Используйте IList для получения JArray Count и используйте Loop для преобразования в список
var array = result["items"].Value<JArray>();
IList collection = (IList)array;
var list = new List<string>();
for (int i = 0; i < collection.Count; j++)
{
list.Add(collection[i].ToString());
}