Chuyển đổi Newtonsoft.Json.Linq.JArray thành một danh sách các loại đối tượng cụ thể


236

Tôi có các biến sau đây của loại {Newtonsoft.Json.Linq.JArray}.

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

]}

Những gì tôi muốn đạt được là để chuyển đổi này để List<SelectableEnumItem>ở đâu SelectableEnumItemlà loại sau đây:

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

Tôi còn khá mới mẻ với lập trình và tôi không chắc liệu điều này có khả thi hay không. Bất kỳ trợ giúp với ví dụ làm việc sẽ được đánh giá rất cao.

Câu trả lời:


479

Chỉ cần gọi array.ToObject<List<SelectableEnumItem>>()phương thức. Nó sẽ trả lại những gì bạn cần.

Tài liệu: Chuyển đổi JSON thành một loại


4
Hãy chắc chắn định nghĩa lớp của bạn bao gồm một hàm tạo không tham số.
Faust

1
Vậy làm thế nào để xử lý nếu mảng có trường null? Lần này tôi nhận được lỗi JsonSerializationException. Tôi muốn dữ liệu và tôi muốn nó vẫn là null cho bất kỳ dữ liệu null nào.
Oblar Turkoglu

1
@nsarchar Bạn đã kiểm tra tài sản của bạn là nullable chưa?
Jannik

@realPro Chỉ cần làm việc cho tôi. Bạn có chắc chắn rằng bạn có một mảng và các JObject trong JArray có thể ánh xạ đúng không?
VSO

Bạn cũng sẽ thấy lỗi này Nếu bạn vô tình sử dụng cái không chung chung JsonConvert.DeserializeObject(value)thay vìJsonConvert.DeserializeObject<T>(value)
Chad Hedgcock

42

Ví dụ trong câu hỏi là một trường hợp đơn giản hơn trong đó các tên thuộc tính khớp chính xác trong json và trong mã. Nếu tên thuộc tính không khớp chính xác, ví dụ: thuộc tính trong json là "first_name": "Mark"và thuộc tính trong mã FirstNamethì sử dụng phương thức Chọn như sau

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

Thưa ông, mã này nhận được giá trị đầu tiên từ phản hồi của tôi nhưng tôi có rất nhiều giá trị làm thế nào tôi có thể nhận được tất cả các giá trị. Nhưng tôi cần nhận được một giá trị. Ý tôi là có một tên và họ trong phản hồi. làm việc đó đi ?
tpbafk

6

Giá trị trả về API trong trường hợp của tôi như được hiển thị ở đây:

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

Việc chuyển đổi mảng vật phẩm thành danh sách khách hàng đã được xử lý như hiển thị ở đây:

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

Cảm ơn điều này đã giúp tôi sử dụng các đối tượng động trong C #
Anthony McGrath

2

Tôi có thể nghĩ ra phương pháp khác nhau để đạt được cùng một

IList<SelectableEnumItem> result= array;

hoặc (tôi đã có một số tình huống rằng cái này không hoạt động tốt)

var result = (List<SelectableEnumItem>) array;

hoặc sử dụng phần mở rộng linq

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

hoặc là

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

hoặc rõ ràng hơn

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

hãy chú ý trong giải pháp trên tôi đã sử dụng Object động

Tôi có thể nghĩ ra một số giải pháp khác là sự kết hợp của các giải pháp trên. nhưng tôi nghĩ rằng nó bao gồm hầu hết tất cả các phương pháp có sẵn ngoài kia.

Bản thân tôi sử dụng cái đầu tiên


1
Bạn đã không sử dụng bất kỳ Đối tượng động. Bạn chỉ sử dụng đối tượng gõ mạnh. Xin vui lòng, xem xét CLR và DLR cho sự khác biệt giữa hai.
dùng1789573

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

Bạn cũng có thể sử dụng chú thích JsonProperty và giải tuần tự hóa đối tượng JSON của bạn vào danh sách. 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

Sử dụng IList để lấy số lượng JArray và sử dụng vòng lặp để chuyển đổi thành danh sách

       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());             
            }                         
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.