Json.Net中的私人设置者

我知道有一个属性来处理私人setter,但我希望这种行为作为默认,有没有办法做到这一点? 除了调整来源。 如果有这样的设置会很好。

更新了,新的答案

我已经为此编写了一个源代码分发NuGet,它使用两个自定义合约parsing器安装一个文件:

  • PrivateSetterContractResolver
  • PrivateSetterCamelCasePropertyNamesContractResolver

安装NuGet:

Install-Package JsonNet.PrivateSettersContractResolvers.Source 

然后,只需使用任何parsing器:

 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; 

默认的序列化选项支持所有类的成员。 因此,此解决scheme将返回所有私有成员types,包括字段 我只对支持私人定制者感兴趣。

Alt2:创build一个自定义ContractResolver:

因此,这是更好的select,因为我们只是检查属性。

 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在反序列化时填充只读属性的实际属性,这就是简单的[JsonProperty] ,例如:

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

@丹尼尔的答案(Alt2)是现货,但我需要这个私人设置和getters(我正在使用一个API,其实只有一些只写的东西,如user.password 。)这是我结束了与:

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

因此注册:

 JsonConvert.DefaultSettings = () => new JsonSerializerSettings { ContractResolver = new NonPublicPropertiesResolver() };