Newtonsoft.Json.Linq.JArray öğesini belirli bir nesne türü listesine dönüştürme


236

Aşağıdaki tür değişken var {Newtonsoft.Json.Linq.JArray}.

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

]}

Ne yapmak istiyorum bu aşağıdaki tür List<SelectableEnumItem>nerede dönüştürmek için SelectableEnumItem:

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

Programlamaya oldukça yeniyim ve bunun mümkün olup olmadığından emin değilim. Çalışma örneği ile ilgili herhangi bir yardım büyük takdir edilecektir.

Yanıtlar:


480

Sadece array.ToObject<List<SelectableEnumItem>>()yöntemi çağır . İhtiyacınız olanı geri verecektir.

Belgeler: JSON'u bir Türe Dönüştür


4
Sınıf tanımınızın parametresiz bir kurucu içerdiğinden emin olun.
Faust

1
Öyleyse dizi boş bir alana sahipse nasıl işlenir? Bu sefer JsonSerializationException hatası alıyorum. Veri istiyorum ve herhangi bir boş veri için boş kalmasını istiyorum.
Ensar Türkoğlu

1
@nsarchar Mülkünüzün sıfırlanabilir olduğunu kontrol ettiniz mi?
Jannik

@realPro Sadece benim için çalıştı. Bir dizinin olduğundan ve bu JArray'deki JObjects öğesinin düzgün eşlenebildiğinden emin misiniz?
VSO

Ayrıca bu hatayı da görürsünüz Yanlışlıkla jenerik olmayanı JsonConvert.DeserializeObject(value)kullanırsanızJsonConvert.DeserializeObject<T>(value)
Chad Hedgcock

42

Sorudaki örnek, özellik adlarının tam olarak json ve kod ile eşleştiği daha basit bir durumdur. Özellik adları tam olarak eşleşmezse, örneğin json'daki "first_name": "Mark"özellik ve koddaki özellik aşağıdaki gibi Select yönteminiFirstName kullanır

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

Efendim bu kod benim yanıt ilk değeri almak ama ben nasıl tüm değerleri alabilirim çok sayıda değer var.Ama ben sadece bir değer almak gerekir Ben yanıt bir ad ve soyadı demek istiyorum.Ben nasıl sadece nasıl isim alabilirim yap bunu ?
tpbafk

6

Burada gösterildiği gibi benim durumumda API dönüş değeri:

{
  "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": "sebichondo@gmail.com",
      "id": 1,
      "addedDate": "2018-02-02T00:00:00",
      "modifiedDate": "2018-02-02T00:00:00"
    }
  ],
  "hasPreviousPage": false,
  "hasNextPage": false
}

İtems dizisinin müşteri listesine dönüştürülmesi burada gösterildiği gibi gerçekleştirildi:

 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);
        }

Teşekkürler bu benim için C # dinamik nesneler kullanarak çalıştı
Anthony McGrath

2

Bunu başarmak için farklı bir yöntem düşünebilirim

IList<SelectableEnumItem> result= array;

veya (bunun iyi çalışmadığı bir durumum vardı)

var result = (List<SelectableEnumItem>) array;

veya linq uzantısını kullanın

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

veya

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

veya daha açık bir şekilde

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

dinamik çözüm kullandım yukarıdaki çözüm lütfen dikkat

Yukarıdaki çözümlerin birleşimi olan daha fazla çözüm düşünebilirim. ama bence neredeyse mevcut tüm yöntemleri kapsıyor.

Ben kendim ilkini kullanıyorum


1
Dinamik Nesne kullanmadınız. Yalnızca kuvvetle yazılmış bir nesne kullandınız. İkisi arasındaki farklar için lütfen CLR ve DLR'ye bakın.
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;
  }
}

Ayrıca JsonProperty ek açıklamasını kullanabilir ve JSON nesnenizin bir listesini serileştirebilirsiniz. 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

JArray Sayımı almak için IList kullanın ve Listeye Dönüştürmek için Döngü Kullanın

       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());             
            }                         
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.