/
githubmirror
/
aspnetcore
Обзор
Документация
Войти
/
githubmirror
/
aspnetcore
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Features/JsonPatch.SystemTextJson/test/TestObjectModels/HeterogenousCollection.cs
125 строк
4 KB
Artak
Added System.Text.Json serialization-based JsonPatch implementation (#61313)
22 апр 2025, 01:53
Не верифицирован
22 апр 2025, 01:53
b9e9970
Код
Авторство
О чём код?
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; using System.Collections.Generic; using System.Text.Json; using System.Text.Json.Serialization; using System.Text.Json.Serialization.Metadata; namespace Microsoft.AspNetCore.JsonPatch.SystemTextJson; public abstract class Shape { public string ShapeProperty { get; set; } } public class Circle : Shape { public string CircleProperty { get; set; } } public class Rectangle : Shape { public string RectangleProperty { get; set; } } public class Square : Shape { public Rectangle Rectangle { get; set; } } public class Canvas { public IList<Shape> Items { get; set; } } public class RectangleContractResolver : DefaultJsonTypeInfoResolver { public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options) { if (type == typeof(Rectangle)) { JsonTypeInfo<Rectangle> jsonTypeInfo = (JsonTypeInfo<Rectangle>)base.GetTypeInfo(type, options); jsonTypeInfo.CreateObject = () => new Rectangle(); var stringComparison = options.PropertyNameCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal; foreach (var property in jsonTypeInfo.Properties) { if (nameof(Rectangle.ShapeProperty).Equals(property.Name, stringComparison)) { property.Get = (obj) => ((Rectangle)obj).ShapeProperty; property.Set = (obj, value) => ((Rectangle)obj).ShapeProperty = (string)value; } else if (nameof(Rectangle.RectangleProperty).Equals(property.Name, stringComparison)) { property.Get = (obj) => ((Rectangle)obj).RectangleProperty; property.Set = (obj, value) => ((Rectangle)obj).RectangleProperty = (string)value; } } return jsonTypeInfo; } return base.GetTypeInfo(type, options); } } public class RectangleJsonConverter : JsonConverter<Rectangle> { public override Rectangle Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { if (reader.TokenType == JsonTokenType.String) { return new Rectangle { RectangleProperty = reader.GetString() }; } if (reader.TokenType != JsonTokenType.StartObject) { throw new JsonException(); } var rectangle = new Rectangle(); while (reader.Read()) { if (reader.TokenType == JsonTokenType.EndObject) { return rectangle; } if (reader.TokenType != JsonTokenType.PropertyName) { throw new JsonException(); } string propertyName = reader.GetString(); reader.Read(); switch (propertyName) { case nameof(Rectangle.ShapeProperty): rectangle.ShapeProperty = reader.GetString(); break; case nameof(Rectangle.RectangleProperty): rectangle.RectangleProperty = reader.GetString(); break; default: throw new JsonException(); } } return rectangle; } public override void Write(Utf8JsonWriter writer, Rectangle value, JsonSerializerOptions options) { writer.WriteStartObject(); writer.WriteString(nameof(Rectangle.ShapeProperty), value.ShapeProperty); writer.WriteString(nameof(Rectangle.RectangleProperty), value.RectangleProperty); writer.WriteEndObject(); } }