如何使 ShouldSerialize*() 仅适用于 XML 而不是 JSON 序列化



当我使用 XmlSerializer 时,我正在使用 ShouldSerialize 方法有条件地序列化字段。但是现在我需要使用 JSON 序列化同一个类,但我希望在使用 JSON 时忽略 ShoulSerialize 方法,我可以以任何方式做到这一点吗?

[TestClass]
public class UnitTest1
{
    private readonly Customer _customer = new Customer
        {
            FirstName = "Paulo",
            LastName = "Balbino",
            Age = 25
        };
    [Serializable]
    public class Customer
    {
        [XmlElement("FirstName")]
        public string FirstName { get; set; }
        [XmlElement("LastName")]
        public string LastName { get; set; }
        [XmlElement("Age")]
        public int Age { get; set; }
        public bool ShouldSerializeLastName()
        {
            return Age > 30; // Enter here only if it is XmlSerialize.
        }
    }
    [TestMethod]
    public void XmlSerialize()
    {
        try
        {
            var xmlSerializer = new XmlSerializer(typeof(Customer));
            using (var textWriter = new StringWriter())
            {
                xmlSerializer.Serialize(textWriter, _customer);
                Debug.WriteLine(textWriter.ToString());
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
    }
    [TestMethod]
    public void JsonConvert()
    {
        try
        {
            var json = Newtonsoft.Json.JsonConvert.SerializeObject(_customer);
            Debug.WriteLine(json);
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
        }
    }
}

结果 Xml:

<?xml version="1.0" encoding="utf-16"?>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FirstName>Paulo</FirstName>
  <Age>25</Age>
</Customer>

结果 Json:

{"FirstName":"Paulo","Age":25}

两者都转到ShouldSerializeLastName()方法,但是,我希望在 JSON 中忽略它并显示所有字段。

您可以使用自己的协定解析程序并设置 DefaultContractResolver.IgnoreShouldSerializeMembers = true 来禁用 Json.NET 对ShouldSerialize*()条件序列化的支持。

首先,按如下方式分配合约解析器:

static DefaultContractResolver IgnoreShouldSerializeContractResolver = new DefaultContractResolver
{
    IgnoreShouldSerializeMembers = true,
    //Set other properties as required, e.g.:
    //NamingStrategy = new CamelCaseNamingStrategy(),
};

然后按如下方式使用它:

var settings = new JsonSerializerSettings
{
    ContractResolver = IgnoreShouldSerializeContractResolver,
};
var json = Newtonsoft.Json.JsonConvert.SerializeObject(_customer, settings);

笔记:

  • 您可能希望缓存协定以获得最佳性能,因为它只为每种类型生成一次协定信息,然后缓存它。

  • 由于协定解析程序缓存类型信息,因此不建议在构造并用于生成协定后修改预先存在的协定解析程序的属性。

  • IgnoreShouldSerializeMembers是在 Json.NET 11.0.1 中引入的。

在这里品尝小提琴。

相关内容

  • 没有找到相关文章

最新更新