Частные сеттеры в Json.Net

Я знаю, что есть атрибут для работы с частными сеттерами, но я вроде хочу, чтобы это поведение было дефолтом, есть ли способ сделать это? Кроме настройки источника. Было бы здорово, если бы была установка для этого.

Обновлен новый ответ

Я написал исходный дистрибутив NuGet для этого, который устанавливает один файл с двумя настраиваемыми разделителями контрактов:

  • PrivateSetterContractResolver
  • PrivateSetterCamelCasePropertyNamesContractResolver

Установите NuGet:

Install-Package JsonNet.PrivateSettersContractResolvers.Source 

Затем просто используйте любой из резольверов:

 var settings = new JsonSerializerSettings { ContractResolver = new PrivateSetterContractResolver() }; var model = JsonConvert.DeserializeObject(json, settings); 

Вы можете прочитать об этом здесь: http://danielwertheim.se/json-net-private-setters-nuget/

GitHub repo: https://github.com/danielwertheim/jsonnet-privatesetterscontractresolvers

Старый ответ (по-прежнему действителен)

Есть две альтернативы, которые могут решить проблему.

Alt 1: На десериализаторах

 ContractResolver.DefaultMembersSearchFlags = DefaultMembersSearchFlags | BindingFlags.NonPublic; 

Параметр сериализации по умолчанию поддерживает все типы членов classа. Поэтому это решение вернет все типы частных членов, включая поля. Меня интересует также поддержка частных разработчиков.

Alt2: создать пользовательский ContractResolver:

Поэтому это лучшие варианты, так как мы просто проверяем свойства.

 public class SisoJsonDefaultContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty( MemberInfo member, MemberSerialization memberSerialization) { //TODO: Maybe cache var prop = base.CreateProperty(member, memberSerialization); if (!prop.Writable) { var property = member as PropertyInfo; if (property != null) { var hasPrivateSetter = property.GetSetMethod(true) != null; prop.Writable = hasPrivateSetter; } } return prop; } } 

Для получения дополнительной информации прочитайте мой пост: http://danielwertheim.se/json-net-private-setters/

Я пришел сюда, ища фактический атрибут, который заставляет Json.NET заполнять свойство readonly при десериализации, и это просто [JsonProperty] , например:

 [JsonProperty] public Guid? ClientId { get; private set; } 

@ Ответ Даниила (Alt2) – это место, но мне нужно было это работать как для частных разработчиков, так и для геттеров (я работаю с API, который на самом деле имеет несколько user.password только для записи, например user.password .) Вот что я закончил с:

 public class NonPublicPropertiesResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var prop = base.CreateProperty(member, memberSerialization); if (member is PropertyInfo pi) { prop.Readable = (pi.GetMethod != null); prop.Writable = (pi.SetMethod != null); } return prop; } } 

Зарегистрировано таким образом:

 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { ContractResolver = new NonPublicPropertiesResolver() }; 
  • JToken: получить исходное / оригинальное значение JSON
  • Удаление десериализации JSON в объект с помощью Json.NET
  • Deserialize json, который имеет некоторое имя свойства, начиная с числа
  • Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1
  • Как сериализовать словарь как часть его родительского объекта с помощью Json.Net
  • Можно ли указать путь в атрибуте для сопоставления свойства в моем classе с дочерним свойством в моем JSON?
  • Обнаружен цикл саморегуляции - Возврат данных из WebApi в браузер
  • Использование преобразователей Json.NET для десериализации свойств
  • json.net: указать конвертер для ключей словаря
  • Исключить свойство из сериализации через пользовательский атрибут (json.net)
  • .NET NewtonSoft JSON десериализует карту для другого имени свойства
  • Давайте будем гением компьютера.