web-dev-qa-db-fra.com

Convertir Newtonsoft.Json.Linq.JArray en une liste de types d'objet spécifiques

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>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.

209
Mdb

Il suffit d'appeler la méthode array.ToObject<List<SelectableEnumItem>>(). Il retournera ce dont vous avez besoin.

Documentation: Convertir JSON en un type

423
HoberMellow

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();
39
Souvik Basu

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);
        }
4
stephen ebichondo

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

2
Mo Hrad A
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;
  }
}
2
Mohammed Hossen

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());             
            }                         
1
Kumaran