Могу ли я настроить сериализацию Json.NET без аннотирования моих классов?

Мне нужно сериализовать некоторые классы сущностей в JSON, используя Json.NET. Для того, чтобы настроить имена свойств, я использую [JsonProperty] атрибут, как это:

    [JsonProperty("lastName")]
    public string LastName { get; set; }

Проблема в том, что я предпочел бы, чтобы в моих сущностях не было атрибутов, связанных с JSON... Есть ли способ как-то экранировать аннотации, чтобы они не загромождали мои сущности?

С помощью XmlSerializer, это может быть легко сделано с XmlAttributeOverrides учебный класс. Есть ли что-то подобное для Json.NET?

1 ответ

Решение

Да, вы можете создать пользовательский обработчик контракта и настроить JsonProperty определение без использования атрибутов. Пример следует:

class Person { public string First { get; set; } }

class PersonContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(
        MemberInfo member, 
        MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);

        if (member.DeclaringType == typeof(Person) && member.Name == "First")
        {
            property.PropertyName = "FirstName";
        }

        return property;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var result = JsonConvert.SerializeObject(
            new Person { First = "John" },
            new JsonSerializerSettings 
            { 
                ContractResolver = new PersonContractResolver() 
            });

        Console.WriteLine(result);
    }
}

Эти выходные данные этого примера программы будут следующими:

// {"FirstName":"John"}
Другие вопросы по тегам