c#-忽略WebApiConfig中的空/空值和guid空

时间:2019-06-28 09:36:55

标签: c#

我有一个在GET函数中返回json的控制器。我想忽略\删除我发送给第三部分的json的空值,空值和指南空值。

在WebApiConfig中,我使用: config.Formatters.JsonFormatter.SerializerSettings =新的JsonSerializerSettings {NullValueHandling = NullValueHandling.Ignore}; 而且它适用于null值,但不适用于empty \ guid.empty值。

所以我尝试添加config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new EmptyToNullConverter());和类EmptyToNullConverter。要将空值转换为null,然后由另一个命令将其删除,但这是行不通的,因为它不会转换值。

EmptyToNullConverter 类为:

public class EmptyToNullConverter : JsonConverter
    {
        private JsonSerializer _stringSerializer = new JsonSerializer();

        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(string);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            string value = _stringSerializer.Deserialize<string>(reader);

            if (string.IsNullOrEmpty(value) ||  value == Guid.Empty.ToString())
            {
                value = null;
            }

            return value;
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            _stringSerializer.Serialize(writer, value);
        }

    }

我该怎么办?

非常感谢

1 个答案:

答案 0 :(得分:0)

即使在序列化时对象类型为Guid。它仍然不能为null,尝试在序列化级别进行覆盖可能会造成混乱,就像接收方在响应模型中期望Guid一样。即使您没有在JSON响应中发送任何内容,它们的代码仍可能会初始化一个空的Guid

有什么原因不能使用可为空的Guid?鉴于您是堆栈溢出的新手,我可能会不明智地假设您是编码新手,因此您可能不熟悉可空值类型。

诸如intfloatGUIDDateTime等的值类型将始终具有默认值,但是您可以通过以下方式强制它们为空声明带有后缀的问号。

例如

int x // == 0;
int? x // == null;
Guid g // == 00000000-0000-0000-0000-000000000000;
Guid? g // == null;

一个好的通用规则是,如果值类型可以本质上为null,则使其为可为空。然后,您将不需要任何花哨的转换。