Heim > Backend-Entwicklung > C++ > Wie serialisiere ich eine von einer Liste abgeleitete Klasse mit zusätzlichen Mitgliedern mithilfe von Json.NET?

Wie serialisiere ich eine von einer Liste abgeleitete Klasse mit zusätzlichen Mitgliedern mithilfe von Json.NET?

DDD
Freigeben: 2025-01-07 13:07:41
Original
387 Leute haben es durchsucht

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

So serialisieren Sie Mitglieder einer Klasse, die von einer Liste abgeleitet ist Verwendung von Json.net

Um die Arbeit mit einer bestimmten Komponente zu erleichtern, ist es notwendig, eine neue Klasse, PagedResult, aus List abzuleiten. und weitere Mitglieder einbeziehen. Beim Ausführen des JSON-Deserialisierers wird jedoch nur die Liste serialisiert. Durch die Verwendung der Attribute [JsonObject] und [JsonProperty] für die abgeleitete Klasse werden nur die abgeleiteten Klassenmitglieder serialisiert, mit Ausnahme der Liste. In diesem Artikel wird erläutert, wie sowohl die Liste als auch ihre abgeleiteten Klassenmitglieder serialisiert werden.

Json.Net behandelt Klassen, die IEnumerable implementieren, standardmäßig als Arrays. Das Dekorieren der Klasse mit einem [JsonObject]-Attribut kann dieses Verhalten zwar überschreiben, es serialisiert jedoch nur Objekteigenschaften, sodass die Liste nicht serialisiert bleibt. Dies liegt daran, dass auf die Liste nicht über eine öffentliche Eigenschaft zugegriffen werden kann, sondern über die Methode GetEnumerator().

Um beide einzuschließen, können Sie entweder eine öffentliche Eigenschaft in Ihrer abgeleiteten Klasse für die Liste zugänglich machen, wie von @ vorgeschlagen. Konrad, oder erstellen Sie einen benutzerdefinierten JsonConverter, um das gesamte Objekt zu serialisieren. Unten ist ein Beispiel:

Angenommen, PagedResult existiert als:

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; }
}
Nach dem Login kopieren

So erstellen Sie einen benutzerdefinierten Konverter:

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;
    }
}
Nach dem Login kopieren

(Beachten Sie, dass [JsonObject] und [JsonProperty] bei diesem Ansatz nicht erforderlich sind, da das Wissen von was serialisiert werden soll, ist in der Konverterklasse codiert.)

Unten finden Sie eine Demonstration mit dem Konverter:

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);
    }
}
Nach dem Login kopieren

Ausgabe:

{
  "PageSize": 10,
  "PageIndex": 0,
  "TotalItems": 3,
  "TotalPages": 1,
  "Items": [
    "foo",
    "bar",
    "baz"
  ]
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie serialisiere ich eine von einer Liste abgeleitete Klasse mit zusätzlichen Mitgliedern mithilfe von Json.NET?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage