我知道有一个属性来处理私人设置,但我想要这种行为作为默认,有没有办法实现这一点?除了调整源。将是伟大的,如果有一个设置为此。
更新,新的答案
我写了一个源分布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:在解串器上
默认序列化选项支持所有类型的成员。因此,此解决方案将返回所有私有成员类型,包括字段我只有兴趣也支持私人套件。
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/