0

我有几个类用作数据传输对象(在 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 类中指定的,有些是在外部指定的。

有没有更好的方法来做到这一点?

4

1 回答 1

0

我可能会通过创建一个派生自 JsonProperty 并包含您想要的设置的属性 [SerializableDto] 来做到这一点。由于所有其余的说明符(例如属性名称)都是使用属性完成的,因此看起来更加一致。如果你把它放在一个接口中,你会创建一个更复杂的情况,其中一些规范是通过实现一个接口来完成的,而其他相关的规范是使用属性来完成的。

没有检查 JsonProperty 是否被密封。如果是这样,那么你的情况就更棘手了。尽管使用使用 TypeDescriptor.AddAttributes 动态附加 Json 属性的属性,您仍然可以做到这一点。

于 2020-01-30T04:29:18.673 回答