У нас есть API проверки версий, который мы обновляем с .NET Core 3.1 до минимального API .NET 8. Он должен быть обратно совместим, но мы столкнулись с проблемой.
Начиная с .NET 6, сериализация JSON по умолчанию для System.Version изменилась. Мы написали конвертер, который наследует от Newtonsoft.Json.JsonConverter.
Я пытался добавить конвертер в сборщик приложений, но при вызове конечной точки он вызывает сериализацию по умолчанию вместо пользовательской. кода, и у меня недостаточно опыта в этой области, чтобы понять, чего мне не хватает.
Как мне это настроить, чтобы получить пользовательскую сериализацию?
Конвертер версий
public class VersionConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => true;
public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
int major = 0, minor = 0, build = -1, revision = -1;
while (reader.Read() && reader.TokenType != JsonToken.EndObject)
{
if (reader.TokenType == JsonToken.PropertyName)
{
string propertyName = reader.Value.ToString();
reader.Read();
switch (propertyName)
{
case "major":
major = Convert.ToInt32(reader.Value);
break;
case "minor":
minor = Convert.ToInt32(reader.Value);
break;
case "build":
build = Convert.ToInt32(reader.Value);
break;
case "revision":
revision = Convert.ToInt32(reader.Value);
break;
}
}
}
return new Version(major, minor, build, revision);
}
throw new JsonSerializationException("Unexpected token when deserializing Version");
}
public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("major");
writer.WriteValue(value.Major);
writer.WritePropertyName("minor");
writer.WriteValue(value.Minor);
writer.WritePropertyName("build");
writer.WriteValue(value.Build);
writer.WritePropertyName("revision");
writer.WriteValue(value.Revision);
writer.WritePropertyName("majorRevision");
writer.WriteValue(value.MajorRevision);
writer.WritePropertyName("minorRevision");
writer.WriteValue(value.MinorRevision);
writer.WriteEndObject();
}
}
Ответ проверки версии
public class VersionCheckResponse
{
[JsonConverter(typeof(VersionConverter))]
public Version Version { get; set; }
}
Program.cs (упрощенный)
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new VersionConverter());
});
builder.Services.AddApiVersioning(options =>
{
options.ReportApiVersions = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ApiVersionReader = new HeaderApiVersionReader(HeaderNames.ApiVersion);
});
builder.Services.AddScoped();
builder.Services.AddControllers();
// Configure routing options for case-insensitive endpoints
builder.Services.Configure(options =>
{
options.LowercaseUrls = true;
options.LowercaseQueryStrings = true;
});
WebApplication app = builder.Build();
app.MapGet("/version", ([FromServices] IVersionManager versionManager, [FromQuery] string productName, [FromQuery] Version productVersion) =>
{
ValidationResult result = versionManager.CheckVersion(productName, productVersion);
if (result.IsValid)
{
return Results.Ok(new ApiResponse(result.Value));
}
return Results.BadRequest(new ApiResponse(result.ValidationMessage, result.ValidationErrors));
});
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.MapHealthChecks("/health");
app.Run();
Подробнее здесь: https://stackoverflow.com/questions/792 ... inimal-api
Пользовательский конвертер Newtonsoft не вызывается в минимальном API .NET 8 [дубликат] ⇐ C#
Место общения программистов C#
1733946738
Anonymous
У нас есть API проверки версий, который мы обновляем с .NET Core 3.1 до минимального API .NET 8. Он должен быть обратно совместим, но мы столкнулись с проблемой.
Начиная с .NET 6, сериализация JSON по умолчанию для System.Version изменилась. Мы написали конвертер, который наследует от Newtonsoft.Json.JsonConverter.
Я пытался добавить конвертер в сборщик приложений, но при вызове конечной точки он вызывает сериализацию по умолчанию вместо пользовательской. кода, и у меня недостаточно опыта в этой области, чтобы понять, чего мне не хватает.
Как мне это настроить, чтобы получить пользовательскую сериализацию?
Конвертер версий
public class VersionConverter : JsonConverter
{
public override bool CanRead => true;
public override bool CanWrite => true;
public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.StartObject)
{
int major = 0, minor = 0, build = -1, revision = -1;
while (reader.Read() && reader.TokenType != JsonToken.EndObject)
{
if (reader.TokenType == JsonToken.PropertyName)
{
string propertyName = reader.Value.ToString();
reader.Read();
switch (propertyName)
{
case "major":
major = Convert.ToInt32(reader.Value);
break;
case "minor":
minor = Convert.ToInt32(reader.Value);
break;
case "build":
build = Convert.ToInt32(reader.Value);
break;
case "revision":
revision = Convert.ToInt32(reader.Value);
break;
}
}
}
return new Version(major, minor, build, revision);
}
throw new JsonSerializationException("Unexpected token when deserializing Version");
}
public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer)
{
writer.WriteStartObject();
writer.WritePropertyName("major");
writer.WriteValue(value.Major);
writer.WritePropertyName("minor");
writer.WriteValue(value.Minor);
writer.WritePropertyName("build");
writer.WriteValue(value.Build);
writer.WritePropertyName("revision");
writer.WriteValue(value.Revision);
writer.WritePropertyName("majorRevision");
writer.WriteValue(value.MajorRevision);
writer.WritePropertyName("minorRevision");
writer.WriteValue(value.MinorRevision);
writer.WriteEndObject();
}
}
Ответ проверки версии
public class VersionCheckResponse
{
[JsonConverter(typeof(VersionConverter))]
public Version Version { get; set; }
}
Program.cs (упрощенный)
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers().AddNewtonsoftJson(options =>
{
options.SerializerSettings.Converters.Add(new VersionConverter());
});
builder.Services.AddApiVersioning(options =>
{
options.ReportApiVersions = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ApiVersionReader = new HeaderApiVersionReader(HeaderNames.ApiVersion);
});
builder.Services.AddScoped();
builder.Services.AddControllers();
// Configure routing options for case-insensitive endpoints
builder.Services.Configure(options =>
{
options.LowercaseUrls = true;
options.LowercaseQueryStrings = true;
});
WebApplication app = builder.Build();
app.MapGet("/version", ([FromServices] IVersionManager versionManager, [FromQuery] string productName, [FromQuery] Version productVersion) =>
{
ValidationResult result = versionManager.CheckVersion(productName, productVersion);
if (result.IsValid)
{
return Results.Ok(new ApiResponse(result.Value));
}
return Results.BadRequest(new ApiResponse(result.ValidationMessage, result.ValidationErrors));
});
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.MapHealthChecks("/health");
app.Run();
Подробнее здесь: [url]https://stackoverflow.com/questions/79273001/newtonsoft-custom-converter-not-called-in-net-8-minimal-api[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия