Konwertuj Newtonsoft.Json.Linq.JArray na listę określonego typu obiektu

236

Mam następującą zmienną typu {Newtonsoft.Json.Linq.JArray}.

properties["Value"] {[
  {
    "Name": "Username",
    "Selected": true
  },
  {
    "Name": "Password",
    "Selected": true
  }

]}

Co chcę osiągnąć jest konwersja to List<SelectableEnumItem>gdzie SelectableEnumItemjest następujący typ:

public class SelectableEnumItem
    {
        public string Name { get; set; }
        public bool Selected { get; set; }
    }

Jestem raczej nowy w programowaniu i nie jestem pewien, czy jest to możliwe. Każda pomoc z działającym przykładem będzie bardzo mile widziana.

Mdb
źródło

Odpowiedzi:

480

Po prostu wywołaj array.ToObject<List<SelectableEnumItem>>()metodę. Zwróci to, czego potrzebujesz.

Dokumentacja: Konwertuj JSON na typ

HoberMellow
źródło
4
Upewnij się, że twoja definicja klasy zawiera konstruktora bez parametrów.
Faust
1
Jak więc sobie poradzić, jeśli tablica ma pole zerowe? Tym razem otrzymuję błąd JsonSerializationException. Chcę dane i chcę, aby pozostały zerowe dla dowolnych danych zerowych.
Ensar Turkoglu
1
@nsarchar Czy sprawdziłeś, czy Twoja nieruchomość ma wartość zerową?
Jannik
@realPro Właśnie dla mnie pracował. Czy na pewno masz tablicę i że obiekty JObject w tym obiekcie JArray mogą poprawnie mapować?
VSO
Ten błąd zobaczysz również, jeśli przypadkowo użyjesz nie-rodzajowy JsonConvert.DeserializeObject(value)zamiastJsonConvert.DeserializeObject<T>(value)
Chad Hedgcock
42

Przykład w pytaniu to prostszy przypadek, w którym nazwy właściwości pasowały dokładnie w jsonie i kodzie. Jeśli nazwy właściwości nie są dokładnie takie same, np. Właściwość w json jest, "first_name": "Mark"a właściwość w kodzie to FirstNameużyj metody Select w następujący sposób

List<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem
{
    FirstName = (string)x["first_name"],
    Selected = (bool)x["selected"]
}).ToList();
Souvik Basu
źródło
Sir, ten kod odbiera pierwszą wartość z mojej odpowiedzi, ale mam wiele wartości, w jaki sposób mogę uzyskać wszystkie wartości, ale muszę uzyskać tylko jedną wartość, to znaczy, że w odpowiedzi jest imię i nazwisko. Chcę uzyskać tylko imię, jak mogę Zrób to ?
tpbafk
6

Zwracana wartość API w moim przypadku, jak pokazano tutaj:

{
  "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
}

Konwersja tablicy pozycji na listę klientów została przeprowadzona, jak pokazano tutaj:

 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);
        }
Stephen ebichondo
źródło
Dzięki temu działało dla mnie przy użyciu dynamicznych obiektów w C #
Anthony McGrath
2

Mogę wymyślić inną metodę osiągnięcia tego samego

IList<SelectableEnumItem> result= array;

lub (miałem sytuację, że ta nie działała dobrze)

var result = (List<SelectableEnumItem>) array;

lub użyj rozszerzenia linq

var result = array.CastTo<List<SelectableEnumItem>>();

lub

var result= array.Select(x=> x).ToArray<SelectableEnumItem>();

lub bardziej konkretnie

var result= array.Select(x=> new SelectableEnumItem{FirstName= x.Name, Selected = bool.Parse(x.selected) });

proszę zwrócić uwagę w powyższym rozwiązaniu użyłem dynamicznego obiektu

Mogę wymyślić kilka innych rozwiązań, które są kombinacjami powyższych rozwiązań. ale myślę, że obejmuje prawie wszystkie dostępne metody.

Ja używam pierwszego

Mo Hrad A.
źródło
1
Nie używałeś żadnych dynamicznych obiektów. Użyłeś tylko silnie napisanego obiektu. Proszę spojrzeć na CLR i DLR na różnice między nimi.
user1789573,
2
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;
  }
}
Mohammed Hossen
źródło
Możesz także użyć adnotacji JsonProperty i deserializować obiekt JSON na listę. public class SelectableEnumItem { [JsonProperty("Name")] public string Name { get; set; } [JsonProperty("Selected")] public bool Selected { get; set; } } public IList<SelectableEnumItem> GetListOfObject(string jsonTextHere) { return JsonConvert.DeserializeObject<List<SelectableEnumItem>>(jsonTextHere); }
Mohammed Hossen
1

Użyj IList, aby uzyskać liczbę JArray i użyj Loop, aby przekonwertować na listę

       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());             
            }                         
Kumaran
źródło