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
클래스 정의에 매개 변수가없는 생성자가 포함되어 있는지 확인하십시오.
Faust

1
그렇다면 배열에 null 필드가 있는지 처리하는 방법은 무엇입니까? 이번에는 JsonSerializationException 오류가 발생합니다. 데이터를 원하고 null 데이터에 대해 null로 유지하고 싶습니다.
Ensar Turkoglu

1
@nsarchar 당신은 당신의 재산이 nullable인지 확인 했습니까?
Jannik

@realPro 방금 저를 위해 일했습니다. 배열이 있고 해당 JArray의 JObject가 올바르게 매핑 될 수 있습니까?
VSO 2016 년

실수로 제네릭이 JsonConvert.DeserializeObject(value)아닌 제네릭을 사용하는 경우JsonConvert.DeserializeObject<T>(value)
Chad Hedgcock

42

문제의 예는 속성 이름이 json 및 코드에서 정확히 일치하는 간단한 경우입니다. 속성 이름이 정확히 일치하지 않으면 (예 : json "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
}

items 배열을 클라이언트 목록으로 변환하는 작업은 다음과 같이 처리되었습니다.

 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 #에서 동적 객체를 사용하여 나를 위해 일한
Anthony McGrath

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의 차이점을 살펴보십시오.
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;
  }
}

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

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());             
            }                         
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.