Перетворити Newtonsoft.Json.Linq.JArray у список конкретного типу об'єкта


236

У мене є така змінна тип {Newtonsoft.Json.Linq.JArray}.

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

]}

Те , що я хочу зробити, щоб перетворити це , List<SelectableEnumItem>де SelectableEnumItemзнаходиться наступний тип:

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

Я досить новачок у програмуванні і не впевнений, чи можливо це. Будь-яка допомога з робочого прикладу буде вдячна.

Відповіді:


480

Просто array.ToObject<List<SelectableEnumItem>>()метод виклику . Це поверне те, що вам потрібно.

Документація: Перетворення JSON у тип


4
Будьте впевнені, що ваше визначення класу містить конструктор без параметрів.
Фауст

1
Так як поводитися, якщо масив має нульове поле? На цей раз я отримую помилку JsonSerializationException. Я хочу, щоб дані, і я хочу, щоб вони залишалися нульовими для будь-яких нульових даних.
Енсар Туркоглу

1
@nsarchar Ви перевірили, що ваше майно є незмінним?
Jannik

@realPro Просто працював на мене. Ви впевнені, що у вас є масив і що JObjects у цьому JArray можуть правильно відображатись?
VSO

Ви також побачите цю помилку, якщо ви випадково скористаєтеся JsonConvert.DeserializeObject(value)JsonConvert.DeserializeObject<T>(value)
негенеріком

42

Приклад у питанні - простіший випадок, коли імена властивостей точно збігаються в json та в коді. Якщо імена властивостей точно не відповідають, наприклад, властивість у json is, "first_name": "Mark"а властивість у коді - FirstNameтоді використовуйте метод Select наступним чином

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

Сер, цей код отримує перше значення з моєї відповіді, але у мене є багато значень, як я можу отримати всі значення. Але мені потрібно отримати лише одне значення, я маю на увазі, що у відповіді є ім’я та прізвище. Я хочу отримати лише ім’я, як я можу зробити це ?
tpbafk

6

Повернення значення API в моєму випадку, як показано тут:

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

Перетворення масиву елементів у список клієнтів оброблялось, як показано тут:

 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 #
Ентоні МакГрат

2

Я можу придумати різний метод, щоб досягти того ж

IList<SelectableEnumItem> result= array;

або (у мене була ситуація, що ця не працювала добре)

var result = (List<SelectableEnumItem>) array;

або використовувати розширення linq

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

або

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

або більш чітко

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

будь ласка, зверніть увагу на вище рішення, я використав динамічний об'єкт

Я можу придумати ще кілька рішень, що є комбінаціями вищезазначених рішень. але я думаю, що він охоплює майже всі доступні методи там.

Сам я використовую перший


1
Ви не використовували жодних динамічних об'єктів. Ви використовували лише сильно набраний об’єкт. Будь ласка, погляньте на CLR та DLR на наявність відмінностей між ними.
користувач1789573

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

Ви також можете використовувати анотацію JsonProperty та деріаріалізувати ваш JSON об’єкт до списку. 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); }
Мохаммед Хоссен

1

Використовуйте IList, щоб отримати кількість підрахунків JArray та використовувати контур для перетворення в список

       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());             
            }                         
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.