> 백엔드 개발 > C++ > Json.NET을 사용하여 추가 멤버가 있는 목록 파생 클래스를 직렬화하는 방법은 무엇입니까?

Json.NET을 사용하여 추가 멤버가 있는 목록 파생 클래스를 직렬화하는 방법은 무엇입니까?

DDD
풀어 주다: 2025-01-07 13:07:41
원래의
387명이 탐색했습니다.

How to Serialize a List-Derived Class with Additional Members Using Json.NET?

List에서 파생된 클래스의 멤버를 직렬화하는 방법 Json.net 사용

특정 구성 요소 작업을 용이하게 하려면 List에서 PagedResult라는 새 클래스를 파생해야 합니다. 추가 구성원을 포함합니다. 그러나 JSON deserializer를 실행하면 목록만 직렬화됩니다. 파생 클래스에서 [JsonObject] 및 [JsonProperty] 특성을 사용하면 목록을 제외하고 파생 클래스 멤버만 직렬화됩니다. 이 문서에서는 목록과 파생 클래스 멤버를 모두 직렬화하는 방법을 살펴봅니다.

Json.Net은 기본적으로 IEnumerable을 구현하는 클래스를 배열로 처리합니다. [JsonObject] 특성으로 클래스를 장식하면 이 동작을 재정의할 수 있지만 개체 속성만 직렬화하고 목록은 직렬화되지 않은 상태로 둡니다. 이는 공용 속성을 통해서가 아니라 GetEnumerator() 메서드를 통해 목록에 액세스할 수 있기 때문입니다.

두 가지를 모두 포함하려면 @에서 제안한 대로 파생 클래스의 공용 속성을 목록에 액세스할 수 있도록 만들 수 있습니다. Konrad 또는 사용자 정의 JsonConverter를 생성하여 객체 전체를 직렬화합니다. 다음은 예입니다.

PagedResult 가정 다음과 같이 존재합니다:

class PagedResult<T> : List<T>
{
    public int PageSize { get; set; }
    public int PageIndex { get; set; }
    public int TotalItems { get; set; }
    public int TotalPages { get; set; }
}
로그인 후 복사

사용자 정의 변환기를 만드는 방법은 다음과 같습니다.

class PagedResultConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(PagedResult<T>));
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        PagedResult<T> result = (PagedResult<T>)value;
        JObject jo = new JObject();
        jo.Add("PageSize", result.PageSize);
        jo.Add("PageIndex", result.PageIndex);
        jo.Add("TotalItems", result.TotalItems);
        jo.Add("TotalPages", result.TotalPages);
        jo.Add("Items", JArray.FromObject(result.ToArray(), serializer));
        jo.WriteTo(writer);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JObject jo = JObject.Load(reader);
        PagedResult<T> result = new PagedResult<T>();
        result.PageSize = (int)jo["PageSize"];
        result.PageIndex = (int)jo["PageIndex"];
        result.TotalItems = (int)jo["TotalItems"];
        result.TotalPages = (int)jo["TotalPages"];
        result.AddRange(jo["Items"].ToObject<T[]>(serializer));
        return result;
    }
}
로그인 후 복사

(이 접근 방식에서는 [JsonObject] 및 [JsonProperty]가 필요하지 않습니다. 직렬화할 항목은 변환기 클래스에 인코딩됩니다.)

아래는 변환기:

class Program
{
    static void Main(string[] args)
    {
        PagedResult<string> result = new PagedResult<string> { "foo", "bar", "baz" };
        result.PageIndex = 0;
        result.PageSize = 10;
        result.TotalItems = 3;
        result.TotalPages = 1;

        JsonSerializerSettings settings = new JsonSerializerSettings();
        settings.Converters.Add(new PagedResultConverter<string>());
        settings.Formatting = Formatting.Indented;

        string json = JsonConvert.SerializeObject(result, settings);
        Console.WriteLine(json);
    }
}
로그인 후 복사

출력:

{
  "PageSize": 10,
  "PageIndex": 0,
  "TotalItems": 3,
  "TotalPages": 1,
  "Items": [
    "foo",
    "bar",
    "baz"
  ]
}
로그인 후 복사

위 내용은 Json.NET을 사용하여 추가 멤버가 있는 목록 파생 클래스를 직렬화하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿