Um die Arbeit mit einer bestimmten Komponente zu erleichtern, ist es notwendig, eine neue Klasse, PagedResult
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
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; } }
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; } }
(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); } }
Ausgabe:
{ "PageSize": 10, "PageIndex": 0, "TotalItems": 3, "TotalPages": 1, "Items": [ "foo", "bar", "baz" ] }
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!