Json.net 重写 DefaultContractResolver 中的方法以反序列化私有 setter。

10

我有一个类,其中的属性具有私有setter,我希望这些属性能够使用Json.Net进行反序列化。我知道可以使用[JsonProperty]属性来完成此操作,但我想通过实现DefaultContractResolver来实现这一点。

以下是我一直在使用的示例代码,但这并不起作用。

static void Main(string[] args)
{
    var a = new a();
    a.s = "somestring";
    a.set();
    Console.WriteLine(JsonConvert.SerializeObject(a));
    var strrr = JsonConvert.SerializeObject(a);

    var strobj = JsonConvert.DeserializeObject<a>(strrr,new                        JsonSerializerSettings
    {
        ContractResolver = new PrivateSetterContractResolver()
    });
    Console.Read();
}

这是我想要序列化的类

public class a
{
    private int test;
    public int Test
    {
        get { return test; }
        private set { test = value; }
    }
    public string s { get; set; }

    public void set()
    {
        test = 33;
    }
}

这是DefaultContractResolver的实现。

public class PrivateSetterContractResolver : DefaultContractResolver
{
    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        // whait do i do here ??? 

        //this dosent work
        return new List<MemberInfo>(objectType.GetProperties().ToList());

    }
}

https://dev59.com/pW855IYBdhLWcg3w75Eu - Ilija Dimov
谢谢。找到了相同的解决方案。 - rakesh
3个回答

9

我在这里找到了解决方法 链接。我一开始试图覆盖错误的方法。你需要覆盖 CreateProperty 方法。

protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        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;
    }

2

如同这里的解决方案/答案所述: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

2

只需使用JsonPropertyAttribute标记私有属性或具有私有setter的属性,它们将自动序列化。因此不需要进行任何覆盖操作。

如下所示:

public class a
{
    private int test;
    [JsonProperty]
    public int Test
    {
        get { return test; }
        private set { test = value; }
    }
    public string s { get; set; }

    [JsonProperty]
    public string anotherProperty { get; private set;}        

    public void set()
    {
        test = 33;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接