Я начинаю переносить код, который у меня есть, с Newtonsoft.Json
на System.Text.Json
в приложении .net Core 3.0.
Я перенес свойства из
[JsonProperty("id")]
к [JsonPropertyName("id")]
но у меня есть некоторые свойства, украшенные атрибутом JsonConverter
как:
[JsonConverter(typeof(DateTimeConverter))]
[JsonPropertyName("birth_date")]
DateTime BirthDate{ get; set; }
Но я не могу найти аналог этого конвертера Newtonsoft в System.Text.Json
Кто-нибудь знает, как этого можно добиться в .net Core 3.0?
Спасибо!
Это другой вопрос, но я хотел бы знать, можно ли этого добиться в System.Text.Json
Не уверен, что новые объекты JSON достаточно зрелые, чтобы справиться со всеми обстоятельствами прямо сейчас, но рад оказаться неправым. Я считаю, что использование Newtonsoft в .NET Core 3 — это изменение в одну строку.
System.Text.Json
теперь поддерживает пользовательские преобразователи типов в .NET 3.0 preview-7 и более поздних версиях.
Вы можете добавить преобразователи, соответствующие типу, и использовать атрибут JsonConverter
, чтобы использовать определенный преобразователь для свойства.
Вот пример преобразования между long
и string
(поскольку javascript не поддерживает 64-битные целые числа).
public class LongToStringConverter : JsonConverter<long>
{
public override long Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options)
{
if (reader.TokenType == JsonTokenType.String)
{
// try to parse number directly from bytes
ReadOnlySpan<byte> span = reader.HasValueSequence ? reader.ValueSequence.ToArray() : reader.ValueSpan;
if (Utf8Parser.TryParse(span, out long number, out int bytesConsumed) && span.Length == bytesConsumed)
return number;
// try to parse from a string if the above failed, this covers cases with other escaped/UTF characters
if (Int64.TryParse(reader.GetString(), out number))
return number;
}
// fallback to default handling
return reader.GetInt64();
}
public override void Write(Utf8JsonWriter writer, long value, JsonSerializerOptions options)
{
writer.WriteStringValue(value.ToString());
}
}
Зарегистрируйте конвертер, добавив его в список Converters
в JsonSerializerOptions
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new LongToStringConverter());
});
Примечание. Текущая версия еще не поддерживает типы, допускающие значение NULL.
Просто для справки: если кто-то ищет StringEnumConverter
в System.Text.Json: using System.Text.Json.Serialization; [JsonConverter(typeof(JsonStringEnumConverter))]
. Проверьте docs.microsoft.com/en-us/dotnet/api/….
Как преобразовать в пользовательский тип? {x: {foo:1,bar:2,baz:{apple:1,orange:2, juice:[1,2,3,4,5]}}
@boop Вы создаете свой тип, а затем пишете преобразователь, который наследуется от JsonConverter<YourType>
с необходимой вам логикой чтения и записи. В документации есть множество примеров, показывающих, как взаимодействовать с API: docs.microsoft.com/en-us/dotnet/standard/serialization/…
@ FranzHuber23 Он сериализуется, но не учитывает значение атрибута EnumMember
, и поэтому имя Enum сериализуется вместо System.Text.Json: JsonStringEnumConverter игнорирует свою политику JsonNamingPolicy во время десериализации. №31619
Вы можете найти JsonConverterAttribute
в пространстве имен System.Text.Json.Serialization
.
Не проще ли вместо этого использовать Newtonsoft вместо того, чтобы мигрировать?