在序列化对象时,有条件地忽略嵌套属性

时间:2017-08-31 10:13:43

标签: c# serialization json.net

我正在努力有条件地序列化另一个对象本身属性的对象的属性。考虑以下类结构:

public class Message
{
    public string Content { get; set; }
    public IEnumerable<Attachment> Attachments { get; set; }
}

public class Attachment
{
    public string Base64Content { get; set; }
    public string FileName { get; set; }
}

在某些情况下,我想序列化Message类中的所有内容,包括所有Attachment个对象及其属性。这可以通过使用简单的JsonConvert.SerializeObject()来完成。如果我一直想忽略Base64Content属性,我可以添加一个&#39; [JsonIgnore]&#39;该属性的属性。但是,在某些情况下,我希望Base64Content序列化,而在其他情况下我不会。

我想创建一个忽略ContractResolver对象的Attachments属性的自定义Message。但是,当然,这忽略了Attachment个对象的整个列表,而不仅仅是Base64Content属性。

有没有办法编写ContractResolver类,让我在序列化Base64Content对象时忽略Message属性?

1 个答案:

答案 0 :(得分:1)

只需创建一个自定义合约解析程序,它会在序列化时排除传递给它的属性,并有条件地传递Base64Content属性。

public class CustomPropertiesContractResolver : DefaultContractResolver
{
    private HashSet<string> _propertySet;

    public CustomPropertiesContractResolver(IEnumerable<string> propertyNames)
    {
        if (propertyNames != null)
        {
            _propertySet = new HashSet<string>(propertyNames, StringComparer.OrdinalIgnoreCase);
        }
    }

    protected override List<MemberInfo> GetSerializableMembers(Type objectType)
    {
        List<MemberInfo> serializableMembers = null;
        var allMembers = base.GetSerializableMembers(objectType);

        if (_propertySet != null && _propertySet.Count > 0)
        {
            serializableMembers = allMembers.Where(m => !_propertySet.Contains(m.Name)).ToList();
        }
        return serializableMembers != null && serializableMembers.Count > 0 ? serializableMembers : allMembers;
    }
}

使用它像:

IEnumerable<string> properties = null;
if (condition)
{
    properties = new List<string> { "Base64Content" };
}

var settings = new JsonSerializerSettings()
{
    ContractResolver = new CustomPropertiesContractResolver(properties)
};
var serializedStr = JsonConvert.SerializeObject(messages, settings);