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() };