Ответ 1
Обновлен новый ответ
Я написал исходный дистрибутив NuGet для этого, который устанавливает один файл с двумя пользовательскими контрактными преобразователями:
- PrivateSetterContractResolver
- PrivateSetterCamelCasePropertyNamesContractResolver
Установите NuGet:
Install-Package JsonNet.PrivateSettersContractResolvers.Source
Затем просто используйте любой из резольверов:
var settings = new JsonSerializerSettings
{
ContractResolver = new PrivateSetterContractResolver()
};
var model = JsonConvert.DeserializeObject<Model>(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;
Параметр сериализации по умолчанию поддерживает все типы членов класса. Поэтому это решение вернет все типы частных членов, включая поля. Меня интересует также поддержка частных разработчиков.
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/