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

225
26 ноября 2017, 11:56

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

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

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

Answer 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.

Answer 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"}
READ ALSO
UpCast C#.Override и Virtual

UpCast C#.Override и Virtual

При создании класса

240
C# вызов методов предка

C# вызов методов предка

Чисто вопрос интереса радиВозможно ли вызвать метод старее чем предок из потомка? Чтонибудь типа

235
Поиск чисел в string

Поиск чисел в string

Решаю задачу:

295