Приветствую! Собственно вопрос в заголовке - для чего используется атрибут [JsonProperty("PropertyName")] в классе при сериализации или десериализации ?
Например если получать из строки обьект вот так :
RootObject Responce = JsonConvert.DeserializeObject<RootObject>(File.ReadAllText("path"));
то результат будет одним и тем же - что есть в классе RootObject модификаторы [JsonProperty("PropertyName")] над полями, что нет. Так зачем они ?
Атрибут JsonProperty, очевидно, используется для замены имени свойств и параметров конструктора.
Maps a JSON property to a .NET member or constructor parameter.
Для примера тестовый класс с единственным свойством
class Test {
public int x { get; set; }
}
создаем экземпляр, сериализуем:
var x = new Test() { x = 1 };
var str = JsonConvert.SerializeObject(x);
Console.WriteLine(str);
имеем результат {"x":1}
Добавляем атрибут
[JsonProperty("y")]
public int x { get; set; }
повторяем операцию, результатом будет строка {"y":1}
Поскольку JSON это прежде всего формат передачи данных, то подобное переименование может иметь смысл для согласования имен свойств в разных системах, либо, когда имя свойства имеет зарезервированное значение, когда формат данных меняется, а рефакторинг не целесообразен, задавать обязательность/необязательность полей, значения по умолчанию (если при десериалзации их не было), указывать, будут ли сохранены null значения и т.п.
Согласно документации
JsonProperty может использовать в следующих случаях:
По умолчанию свойство JSON-объекта будет иметь то же название, что и .Net класса. Данный атрибут позволяет изменить это название.
JsonProperty показывает, что свойство должно быт сериализовано, если объект сериализуется выборочно, а не целиком.
Может включать не публичные (public) свойства для сераилизации и обратно.
Указания способов обработки null-значений, значенйи по умолчанию, обязательных полей, имен типов и т.п.
Изменения NamingStrategy
It can be used to customize the property's collection items JsonConverter, type name handling, and reference handling.
Кроме исчерпывающего ответа уважаемого @terran у модификатора есть еще одно интересное свойство : статичные поля класса также будут записаны в JSON при сериализации, чего не произойдет без модификатора.
class Person
{
public static string Name { get; set; }
}
При попытке получить строку обычным конвертером JsonConvert.SerializeObject статичного поля в нем не окажется. Результат :
{}
Совсем иначе если добавить модификатор :
class Person
{
[JsonProperty("name:")]
public static string Name { get; set; }
}
Результат :
{"name:":"Ivan"}
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости