我有几个类用作数据传输对象(在 C# 中)。这些类都使用 JSON.Net 序列化以发送到 API。不幸的是,API 中指定的属性名称没有标准化的命名约定。一些属性使用驼峰大小写,一些使用蛇形大小写,一些全小写,等等。因此,在将 DTO 序列化为 JSON 时,我需要考虑这一点。此外,当属性为空时,我希望将它们从序列化 JSON 中排除。
所以,这是我的解决方案。我创建了一个名为 ISerializableDto 的空接口,并添加了类级别属性,指定当为空且默认属性命名策略为蛇形套管时应排除属性。
[JsonObject(
NamingStrategyType = typeof(Newtonsoft.Json.Serialization.SnakeCaseNamingStrategy),
ItemNullValueHandling = NullValueHandling.Ignore)]
public interface ISerializableDto
{
}
我所有的 DTO 类都继承自这个接口。当其中一个 DTO 类中的属性的命名约定不是蛇形大小写时,我只需通过属性级别属性显式指定属性名称。
public class ExampleDto : ISerializableDto
{
public string SomeRandomPropertyName { get; set; } // This will serialize to "some_random_property_name"
[JsonProperty(PropertyName = "someRandomCamelCasedPropertyName")]
public string SomeRandomCamelCasedPropertyName { get; set; } // This will serialize to "someRandomCamelCasedPropertyName"
}
这一切都很好。我可以做一个简单的事情JsonConvert.SerializeObject(myDtoObject)
,它的行为完全符合我的预期。除非另有说明,否则属性名称是蛇形大小写的,并且不包括空属性。但是,我不确定这是最好的方法。
有一个带有类级别属性的空接口来指定常见行为是否有意义?
我可以完全删除接口并将类级别属性放在每个 DTO 类上。但是,如果他们稍后需要添加新的 DTO 类,可能会错过它。JsonConvert.SerializeObject
或者,我什至可以在调用中指定这些行为。但我担心有些命名行为是在 DTO 类中指定的,有些是在外部指定的。
有没有更好的方法来做到这一点?