加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在Json.Net的私人设置

发布时间:2020-12-16 19:44:28 所属栏目:百科 来源:网络整理
导读:我知道有一个属性来处理私人设置,但我想要这种行为作为默认,有没有办法实现这一点?除了调整源。将是伟大的,如果有一个设置为此。 更新,新的答案 我写了一个源分布NuGet为此,安装一个单一文件与两个自定义合同解析器: PrivateSetterContractResolver P
我知道有一个属性来处理私人设置,但我想要这种行为作为默认,有没有办法实现这一点?除了调整源。将是伟大的,如果有一个设置为此。
更新,新的答案

我写了一个源分布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/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读