Ubah Newtonsoft.Json.Linq.JArray ke daftar jenis objek tertentu

236

Saya memiliki variabel tipe berikut {Newtonsoft.Json.Linq.JArray}.

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

]}

Yang ingin saya capai adalah untuk mengonversikan ini ke List<SelectableEnumItem>tempat SelectableEnumItemadalah tipe berikut:

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

Saya agak baru dalam pemrograman dan saya tidak yakin apakah ini mungkin. Setiap bantuan dengan contoh kerja akan sangat dihargai.

Mdb
sumber

Jawaban:

480

Cukup panggil array.ToObject<List<SelectableEnumItem>>()metode. Ini akan mengembalikan apa yang Anda butuhkan.

Dokumentasi: Konversi JSON ke Jenis

HoberMellow
sumber
4
Pastikan definisi kelas Anda menyertakan konstruktor tanpa parameter.
Faust
1
Jadi bagaimana menangani jika array memiliki bidang nol? Kali ini saya mendapatkan error JsonSerializationException. Saya ingin data dan saya ingin tetap nol untuk data nol.
Ensar Turkoglu
1
@nsarchar Sudahkah Anda memeriksa bahwa properti Anda tidak dapat dibatalkan?
Jannik
@ realPro Hanya bekerja untuk saya. Apakah Anda yakin memiliki larik dan bahwa JObjects di JArray dapat memetakan dengan benar?
VSO
Anda juga akan melihat kesalahan ini Jika Anda secara tidak sengaja menggunakan yang non-generik dan JsonConvert.DeserializeObject(value)bukanJsonConvert.DeserializeObject<T>(value)
Chad Hedgcock
42

Contoh dalam pertanyaan adalah kasus yang lebih sederhana di mana nama properti sama persis dengan json dan kode. Jika nama properti tidak sama persis, misalnya properti di json adalah "first_name": "Mark"dan properti dalam kode FirstNamekemudian gunakan metode Pilih sebagai berikut

List<SelectableEnumItem> items = ((JArray)array).Select(x => new SelectableEnumItem
{
    FirstName = (string)x["first_name"],
    Selected = (bool)x["selected"]
}).ToList();
Souvik Basu
sumber
Pak kode ini mendapatkan nilai pertama dari respons saya, tetapi saya memiliki banyak nilai bagaimana saya bisa mendapatkan semua nilai. Tapi saya perlu mendapatkan hanya satu nilai yang saya maksudkan ada nama depan dan nama belakang dalam respons. Saya ingin mendapatkan hanya nama depan bagaimana saya bisa lakukan itu ?
tpbafk
6

Nilai pengembalian API dalam kasus saya seperti yang ditunjukkan di sini:

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

Konversi array item ke daftar klien ditangani seperti yang ditunjukkan di sini:

 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
sumber
Terima kasih ini bekerja untuk saya menggunakan objek dinamis di C #
Anthony McGrath
2

Saya dapat memikirkan metode yang berbeda untuk mencapai hal yang sama

IList<SelectableEnumItem> result= array;

atau (saya punya beberapa situasi yang ini tidak bekerja dengan baik)

var result = (List<SelectableEnumItem>) array;

atau gunakan ekstensi LINQ

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

atau

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

atau lebih tepatnya

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

tolong perhatikan solusi di atas saya menggunakan Obyek dinamis

Saya dapat memikirkan beberapa solusi lagi yang merupakan kombinasi dari solusi di atas. tapi saya pikir itu mencakup hampir semua metode yang tersedia di luar sana.

Saya sendiri menggunakan yang pertama

Mo Hrad A
sumber
1
Anda tidak menggunakan Objek dinamis apa pun. Anda hanya menggunakan objek yang sangat diketik. Tolong, lihat CLR dan DLR untuk perbedaan antara keduanya.
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
sumber
Anda juga dapat menggunakan anotasi JsonProperty dan menghapus objek JSON Anda ke daftar. 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

Gunakan IList untuk mendapatkan JArray Count dan Gunakan Loop untuk Konversi ke Daftar

       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
sumber