【问题标题】:Abstract property with JsonIgnore is being serialized (Json.NET)正在序列化具有 JsonIgnore 的抽象属性 (Json.NET)
【发布时间】:2015-03-17 01:57:18
【问题描述】:

我有以下设置:

public abstract class A
{
    [JsonIgnore]
    public abstract Type Foo { get; }
}

public abstract class B : A
{
    public override Type Foo { get { return typeof(D); } }
}

public class C : B
{
}

public abstract class D
{
}

我的问题是,当我通过以下方式序列化 C 的实例时:

JsonConvert.SerializeObject(instanceOfC, serializationSettings));

生成的 JSON 包含属性 Foo 的条目。这是预期的结果吗?

我的serializationSettings如下:

JsonSerializerSettings _serializationSettings = new JsonSerializerSettings
{
    PreserveReferencesHandling = PreserveReferencesHandling.Objects,
    ReferenceLoopHandling = ReferenceLoopHandling.Serialize,
    TypeNameHandling = TypeNameHandling.All,
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
};

编辑:使用 Json.NET 6.0.0 和 .NET 4.5。

【问题讨论】:

标签: json.net


【解决方案1】:

我遇到了同样的问题,我已经通过像这样指定 JsonSerializerSettings 的“ContractResolver”属性来解决它(为你初始化所有必要的属性):

var settings = new JsonSerializerSettings
        {
            Formatting = Formatting.None,
            ContractResolver = new PublicNotInternalPropertiesCamelCaseContractResolver()

        };

这是我的 PublicNotInternalPropertiesCamelCaseContractResolver:

public class PublicNotInternalPropertiesCamelCaseContractResolver : CamelCasePropertyNamesContractResolver
{
    #region Overrides of DefaultContractResolver

    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        var members = base
            .GetSerializableMembers(objectType)
            .Where(m => m.GetCustomAttribute<InternalAttribute>() == null)
            .ToList();

        return members;
    }

    #endregion
}

我不得不创建一个属性“InternalAttribute”,因为某些原因此解决方案不适用于 JsonIgnoreAttribute:

public class InternalAttribute : Attribute
{

}

我是这样使用它的:

public abstract class RavenDbEntity
{
    private string _dbKey;

    [Internal]
    public string DbKey
    {
        get { return _dbKey; }
        set
        {
            _dbKey = value;
            Id = int.Parse(value.Split('/')[1]);
        }
    }

    public int Id { get; set; }
}

所以输出的 JSON 将没有 DbKey 属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多