System.text.json - Используйте пользовательский jsonconverter условно в зависимости от атрибута поляC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 System.text.json - Используйте пользовательский jsonconverter условно в зависимости от атрибута поля

Сообщение Anonymous »

У меня есть пользовательский атрибут [foo] < /code>
реализован следующим образом: < /p>

Код: Выделить всё

public class FooAttribute
: Attribute
{
}
Теперь я хочу использовать систему.

Код: Выделить всё

class SampleInt
{
[Foo]
public int Number { get; init; }

public int StandardNumber { get; init; }

public string Text { get; init; }
}
Когда я сериализую экземпляр этого класса, я хочу, чтобы пользовательский int jsonconverter применил только для этого поля.

Код: Выделить всё

public class IntJsonConverter
: JsonConverter
{
public override int Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
// do whatever before reading if the text starts with "potato". But this should be triggered only if destination type has the Foo attribute. How?
return reader.GetInt32();
}

public override void Write(Utf8JsonWriter writer, int value, JsonSerializerOptions options)
{
writer.WriteStringValue("potato" + value.ToString());
}
}
< /code>
так, чтобы сериализация для < /p>
var sample =
new SampleInt
{
Number = 123,
StandardNumber = 456
Text = "bar"
};
< /code>
Как это < /p>
var serializeOptions = new JsonSerializerOptions();
var serializeOptions.Converters.Add(new IntJsonConverter());
var resultJson = JsonSerializer.Serialize(sample, serializeOptions);
< /code>
Результаты на следующем json < /p>
{
"number": "potato123",
"standardNumber": 456,
"text": "bar"
}
< /code>
и не в < /p>
{
"number": "potato123",
"standardNumber": "potato456",
"text": "bar"
}
Аналогичным образом, я хочу, чтобы десериализация была условной и использовала атрибут [foo] x.AttributeType == typeof(FooAttribute));
var propertyType = propertyInfo.PropertyType;
var isSimpleValue = propertyType.IsValueType || propertyType == typeof(string);
var isSupportedField = isSimpleValue && hasPersonalDataAttribute;
return isSupportedField;
}
}
< /code>
Но я не хочу использовать Newtonsoft. Я хочу использовать New Dotnet System.text.json [/code] Serializer. Можно ли использовать его аналогичным гранулярным образом?

Подробнее здесь: https://stackoverflow.com/questions/687 ... -field-att
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»