c# – 忽略序列化/反序列化的[JsonIgnore]属性

参见英文答案 > Can I optionally turn off the JsonIgnore attribute at runtime?3个
有没有办法可以忽略我无权修改/扩展的类的Json.NET的[JsonIgnore]属性
public sealed class CannotModify
{
    public int Keep { get; set; }

    // I want to ignore this attribute (and acknowledge the property)
    [JsonIgnore]
    public int Ignore { get; set; }
}

我需要序列化/反序列化此类中的所有属性.我已经尝试了继承Json.NET的DefaultContractResolver类并覆盖看起来相关的方法

public class JsonIgnoreAttributeIgnorerContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member,MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member,memberSerialization);

        // Serialize all the properties
        property.ShouldSerialize = _ => true;

        return property;
    }
}

但原始类的属性似乎总是​​赢:

public static void Serialize()
{
    string serialized = JsonConvert.SerializeObject(
        new CannotModify { Keep = 1,Ignore = 2 },new JsonSerializerSettings { ContractResolver = new JsonIgnoreAttributeIgnorerContractResolver() });

    // Actual:  {"Keep":1}
    // Desired: {"Keep":1,"Ignore":2}
}

我深入挖掘,发现了一个名为IAttributeProvider的接口,可以设置(对于Ignore属性,它的值为“Ignore”,因此这可能是需要更改的线索):

...
property.ShouldSerialize = _ => true;
property.AttributeProvider = new IgnoreAllAttributesProvider();
...

public class IgnoreAllAttributesProvider : IAttributeProvider
{
    public IList<Attribute> GetAttributes(bool inherit)
    {
        throw new NotImplementedException();
    }

    public IList<Attribute> GetAttributes(Type attributeType,bool inherit)
    {
        throw new NotImplementedException();
    }
}

代码并没有被击中.

解决方法

你是在正确的轨道上,你只错过了属性.Ignored序列化选项.

将您的合同更改为以下内容

public class JsonIgnoreAttributeIgnorerContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member,MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member,memberSerialization);
        property.Ignored = false; // Here is the magic
        return property;
    }
}

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString(&quot;x2&quot;));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable&lt;Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include &quot;WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...