Страницы

Поиск по вопросам

суббота, 28 декабря 2019 г.

Зачем нужен атрибут [JsonProperty]

#c_sharp #json #парсер


Приветствую! Собственно вопрос в заголовке - для чего используется атрибут [JsonProperty("PropertyName")]
в классе при сериализации или десериализации ?
Например если получать из строки обьект вот так :

RootObject Responce = JsonConvert.DeserializeObject(File.ReadAllText("path"));


то результат будет одним и тем же - что есть в классе RootObject модификаторы [JsonProperty("PropertyName")]
над полями, что нет. Так зачем они ?
    


Ответы

Ответ 1



Атрибут 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.

Ответ 2



Кроме исчерпывающего ответа уважаемого @terran у модификатора есть еще одно интересное свойство : статичные поля класса также будут записаны в JSON при сериализации, чего не произойдет без модификатора. class Person { public static string Name { get; set; } } При попытке получить строку обычным конвертером JsonConvert.SerializeObject статичного поля в нем не окажется. Результат : {} Совсем иначе если добавить модификатор : class Person { [JsonProperty("name:")] public static string Name { get; set; } } Результат : {"name:":"Ivan"}

Комментариев нет:

Отправить комментарий