Мне нужно сделать что-то вроде следующего, но мне нужно сделать это, не добавляя атрибут или иным образом не загрязняя класс модели.Идеальное решение будет работать через JsonSerializerSettings
, не нарушая другие пользовательские сериализации.Между прочим, нижеприведенный вопрос был получен из этого вопроса: Пользовательское преобразование определенных объектов в JSON.NET
public class Person
{
public string FirstName { get; set; }
[JsonConverter(typeof(AllCapsConverter))]
public string LastName { get; set; }
// more properties here in the real example, some of which nest to properties that use their own JsonConverters.
}
JsonConverter
для этого примера игрушки (содержание на самом деле не имеет значения; чтоуместно, что я использую это для свойства):
public class AllCapsConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
=> objectType == typeof(string);
public override bool CanRead => false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotSupportedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var str = value as string;
var upper = str.ToUpperInvariant();
JToken j = JToken.FromObject(upper);
j.WriteTo(writer);
}
}
Проходной юнит-тест:
public class PersonSerializationTest
{
[Fact]
public void SerializePerson_LastNameCaps()
{
var person = new Person
{
FirstName = "George",
LastName = "Washington"
};
var serialized = JsonConvert.SerializeObject(person);
var expected = @"{""FirstName"":""George"",""LastName"":""WASHINGTON""}";
Assert.Equal(expected, serialized);
}
}