J'ai la variable suivante de type {Newtonsoft.Json.Linq.JArray}
.
properties["Value"] {[
{
"Name": "Username",
"Selected": true
},
{
"Name": "Password",
"Selected": true
}
]}
Ce que je veux accomplir est de convertir ceci en List<SelectableEnumItem>
où SelectableEnumItem
est le type suivant:
public class SelectableEnumItem
{
public string Name { get; set; }
public bool Selected { get; set; }
}
Je suis plutôt nouveau dans la programmation et je ne suis pas sûr que cela soit possible. Toute aide avec exemple de travail sera grandement appréciée.
Il suffit d'appeler la méthode array.ToObject<List<SelectableEnumItem>>()
. Il retournera ce dont vous avez besoin.
Documentation: Convertir JSON en un type
L'exemple de la question est un cas plus simple où les noms de propriété correspondent exactement dans json et dans le code. Si les noms de propriété ne correspondent pas exactement, par exemple la propriété en json est "first_name": "Mark"
et la propriété en code est FirstName
, puis utilisez la méthode Select comme suit
List<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem
{
FirstName = (string)x["first_name"],
Selected = (bool)x["selected"]
}).ToList();
La valeur de retour de l'API dans mon cas, comme indiqué ici:
{
"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
}
La conversion du tableau items en liste de clients a été gérée comme indiqué ici:
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);
}
Je peux penser à une méthode différente pour atteindre le même
IList<SelectableEnumItem> result= array;
ou (j'ai eu une situation que celle-ci ne fonctionnait pas bien)
var result = (List<SelectableEnumItem>) array;
ou utilisez l'extension linq
var result = array.CastTo<List<SelectableEnumItem>>();
ou
var result= array.Select(x=> x).ToArray<SelectableEnumItem>();
ou plus explicitement
var result= array.Select(x=> new SelectableEnumItem{FirstName= x.Name, Selected = bool.Parse(x.selected) });
s'il vous plaît faites attention dans la solution ci-dessus, j'ai utilisé objet dynamique
Je peux penser à quelques solutions supplémentaires qui sont des combinaisons des solutions ci-dessus. mais je pense que cela couvre presque toutes les méthodes disponibles.
Moi j'utilise le premier
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;
}
}
Utilisez IList pour obtenir le nombre JArray et utilisez la boucle pour convertir en liste
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());
}