42 lines
1.6 KiB
C#
42 lines
1.6 KiB
C#
using System.Text.Json;
|
||
using System.Text.Json.Serialization;
|
||
|
||
namespace YandexMusic.API.Converters;
|
||
|
||
internal class StringToIntConverter : JsonConverter<int>
|
||
{
|
||
public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||
{
|
||
// Если текущий токен — строка
|
||
if (reader.TokenType == JsonTokenType.String)
|
||
{
|
||
string? stringValue = reader.GetString();
|
||
if (string.IsNullOrEmpty(stringValue))
|
||
{
|
||
throw new JsonException("Строка не может быть пустой или null для преобразования в int.");
|
||
}
|
||
|
||
// Пробуем распарсить с учётом возможных пробелов и инвариантной культуры
|
||
if (int.TryParse(stringValue.Trim(), out int result))
|
||
{
|
||
return result;
|
||
}
|
||
|
||
throw new JsonException($"Невозможно преобразовать строку \"{stringValue}\" в int.");
|
||
}
|
||
|
||
// Если токен — число (стандартное поведение)
|
||
if (reader.TokenType == JsonTokenType.Number)
|
||
{
|
||
return reader.GetInt32();
|
||
}
|
||
|
||
throw new JsonException($"Ожидалась строка или число, получен {reader.TokenType}.");
|
||
}
|
||
|
||
public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
|
||
{
|
||
// Записываем число как обычное JSON-число
|
||
writer.WriteNumberValue(value);
|
||
}
|
||
} |