2012-11-26 16 views
152

Mam następującą zmienną typu {Newtonsoft.Json.Linq.JArray}.Konwertuj Newtonsoft.Json.Linq.JArray na listę określonego typu obiektu

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

]} 

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

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

Jestem raczej ner do programowania i nie jestem pewien, czy jest to możliwe. Każda pomoc z roboczym przykładem zostanie bardzo doceniona.

Odpowiedz

309

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

Dokumentacja: Convert JSON to a Type

+0

Upewnij się, że definicja klasy zawiera konstruktora bez parametrów – Faust

+0

Więc jak obsługiwać, jeśli tablica ma pole zerowe? Tym razem dostaję błąd JsonSerializationException. on dane i chcę, aby pozostały one zerowe dla jakichkolwiek zerowych danych. – nsarchar

+1

@nsarchar Czy sprawdziłeś, że twoja nieruchomość jest zerowa? – Jannik

28

Przykładem w tej kwestii jest prostszy przypadek, w którym nazwy właściwości dopasowane dokładnie w json w kodzie. Jeśli nazwy właściwości nie są dokładnie takie same, np. nieruchomość w JSON jest "first_name": "Mark" a właściwość w kodzie jest FirstName następnie użyć Select method następująco

List<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem 
{ 
    FirstName = (string)x["first_name"], 
    Selected = (bool)x["selected"] 
}).ToList(); 
+0

Sir ten kod otrzymuje pierwszą wartość z mojej odpowiedzi, ale mam wiele wartości, w jaki sposób mogę uzyskać wszystkie wartości. Ale potrzebuję uzyskać tylko jedną wartość, mam na myśli to jest imię i nazwisko w odpowiedzi. Chcę uzyskać tylko imię jak można robię to ? – tpbafk

2

mogę myśleć o innej metody, aby osiągnąć ten sam

IList<SelectableEnumItem> result= array; 

lub (miałem kilka sytuacji, która to jeden nie działa dobrze)

var result = (List<SelectableEnumItem>) array; 

lub wykorzystanie rozszerzeń LINQ

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

lub

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

lub więcej explictly

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

proszę zwrócić uwagę w powyższym roztworze użyłem obiekt dynamiczny

mogę myśleć trochę więcej rozwiązań, które są kombinacje wyżej rozwiązania. ale myślę, że obejmuje ona prawie wszystkie dostępne metody.

Myself używam pierwszy

0

API wartości zwracanej w moim przypadku, jak pokazano tutaj:

{ 

"PageIndex": 1, "pageSize": 10, "TOTALCOUNT": 1, "totalPageCount": 1, "przedmioty": [ { "Imię": "Stephen", "otherNames": "Ebichondo" "PhoneNumber": "+254721250736" "gender": 0, "clientStatus": 0, "dateOfBirth": "1979-08-16T00: 00: 00", "nationalID": "21734397", "emailAddress": "sebichondo @ gmail.com " "id": 1, "addedDate": "2018-02-02T00: 00: 00", "ModifiedDate": "2018-02-02T00: 00: 00" } ] " hasPreviousPage ": false, «hasNextPage»: false }

konwersja tablicy elementów do listy klientów było traktowane 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); 
     } 
Powiązane problemy