Json.Net中的私人二传手 [英] Private setters in Json.Net
问题描述
我知道有一个属性可以处理私人设置员,但是我有点想将此行为作为默认设置,有没有办法做到这一点?除了调整源.如果有相应设置,那就太好了.
更新后的新答案
我为此编写了一个源码分发版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存储库: https://github.com/danielwertheim/jsonnet-privatesetterscontractresolvers >
旧答案(仍然有效)
有两种方法可以解决问题.
替代项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/
I know there's an attribute to handle private setters but I kind of want this behavior as a default, is there a way to accomplish this? Except tweaking the source. Would be great if there was a setting for this.
Updated, new answer
I've written a source distribution NuGet for this, that installs a single file with two custom contract resolvers:
- PrivateSetterContractResolver
- PrivateSetterCamelCasePropertyNamesContractResolver
Install the NuGet:
Install-Package JsonNet.PrivateSettersContractResolvers.Source
Then just use any of the resolvers:
var settings = new JsonSerializerSettings
{
ContractResolver = new PrivateSetterContractResolver()
};
var model = JsonConvert.DeserializeObject<Model>(json, settings);
You can read about it here: http://danielwertheim.se/json-net-private-setters-nuget/
GitHub repo: https://github.com/danielwertheim/jsonnet-privatesetterscontractresolvers
Old answer (still valid)
There are two alternatives that can solve the problem.
Alt 1: On the deserializers
ContractResolver.DefaultMembersSearchFlags =
DefaultMembersSearchFlags | BindingFlags.NonPublic;
The default serialization option supports all types of class member. Therefore this solution will return all private members types including fields. I'm only interested in also supporting private setters.
Alt2: Create a custom ContractResolver:
Therefore this is the better options since we just check the properties.
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;
}
}
For more information, read my post: http://danielwertheim.se/json-net-private-setters/
这篇关于Json.Net中的私人二传手的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!