【问题标题】:Newtonsoft JSON - Way of ignoring properties without adding [JsonIgnore]Newtonsoft JSON - 在不添加 [JsonIgnore] 的情况下忽略属性的方式
【发布时间】:2017-12-14 02:26:21
【问题描述】:

这可能看起来很愚蠢,但这是我可以表达它的唯一方式。

我想要做的是序列化一个对象及其数据。该对象正在继承一个大型 BaseObject 类。我不希望继承对象中的任何信息出现在 Json 对象中,但是 我无法访问或更改 BaseObject 类

该类用于几乎所有对象,并且在其他时候我序列化 Json 需要许多属性,因此将 [JsonIgnore] 添加到该类不会使其工作。

我想知道是否有其他方法可以使用JsonSerializerSettings 或任何其他方法。

任何帮助将不胜感激。

【问题讨论】:

标签: c#


【解决方案1】:

是的,这可以使用自定义合同解析器来实现。

类似这样的:

public class BaseClass
{
    public string BaseClassProperty { get; set; }
}

public class ChildClass: BaseClass
{
    public string ChildClassProperty { get; set; }
}

public class CustomContractResolver : DefaultContractResolver
{

    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
        var propsToIgnore = typeof(BaseClass).GetProperties().Select(p => p.Name).ToList();

        properties =
            properties.Where(p => !propsToIgnore.Contains( p.PropertyName) ).ToList();

        return properties;
    }
}

那么这个:

var test = new ChildClass { BaseClassProperty = "a", ChildClassProperty = "b" };

var searialisedString = JsonConvert.SerializeObject(test, new JsonSerializerSettings
{
    ContractResolver = new CustomContractResolver()
});

Console.WriteLine(searialisedString);

产生预期的输出:

{"ChildClassProperty":"b"}

【讨论】:

  • 这似乎奏效了!我什至不需要弄乱 BaseObject 类。感谢您的帮助。
【解决方案2】:

我建议不要摆弄你的基础对象或序列化程序,它们可能正在其他地方使用并且可能会产生奇怪的效果。

有一种模式可以执行此类操作,您希望在不同区域或域之间屏蔽或聚合数据:

Data transfer object

我建议调查一下。它允许您在 API 上拥有一组更细粒度的模型,这些模型不会公开您的所有代码,您甚至可以通过 nuget 或类似的具有最小依赖关系的小型 DLL 在合同中公开它们。

意味着你的代码看起来有点像

public static class MyObjectDtoMapper {
    public static Contract.MyDto Map(SpecificDomain.MyObject obj) {
        return new MyDto {
            OnlyPropertyWanted = obj.Property
        };
    }
}

var dtoMappedObject = MyObjectJsonDtoMapper.Map(object);
return JsonConvert.SerializeObject(dtoMappedObject);

如果你想扩展它,有像 AutoMapper 这样的库可以提供帮助。这为构建这些 Mapper 类提供了一个框架。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    相关资源
    最近更新 更多