Newtonsoft JsonConvert.DeserializeObject 如何忽略空对象

VSD*_*kar 5 c# json.net

我有以下类定义:

public class Tag
{
    public Guid? TagId { get; set; }
    public string TagText { get; set; }
    public DateTime CreatedOn { get; set; }
}

public class Wiki
{
    public Guid? WikiId { get; set; }
    public string WikiText { get; set; }
    public string Title { get; set; }
    public DateTime CreatedOn { get; set; }
    public IEnumerable<Tag> Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

从数据库中我得到以下 json 对象:

{
    "WikiId": "83981284-0AD3-4420-90AB-15E3BF6BD7B7",
    "WikiText": "Text",
    "Title": "Title",
    "CreatedOn": "2017-08-07T09:16:06.0800000",
    "Tags": [{}] // <-- here i would like to ignore the empty Tag object
}
Run Code Online (Sandbox Code Playgroud)

当我现在做 aJsonConvert.DeserializeObject<Wiki>(json)我得到一个 Wiki 对象,其中包含 1 个带有值的标签列表TagId: null, TagText: null and CreatedOn: "0001-01-01T00:00:00"

有没有办法在反序列化时忽略空的 Tag 对象?我尝试了几个 JsonSerializerSettings 但没有任何帮助。

Bri*_*ers 5

您可以使用自定义JsonConverter在反序列化期间忽略空对象。这样的事情可以工作:

class IgnoreEmptyItemsConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType.IsAssignableFrom(typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        List<T> list = new List<T>();
        JArray array = JArray.Load(reader);
        foreach (JObject obj in array.Children<JObject>())
        {
            if (obj.HasValues)
            {
                list.Add(obj.ToObject<T>(serializer));
            }
        }
        return list;
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用转换器,只需[JsonConverter]向您的Tags属性添加一个属性,如下所示:

public class Wiki
{
    ...
    [JsonConverter(typeof(IgnoreEmptyItemsConverter<Tag>))]
    public IEnumerable<Tag> Tags { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

小提琴:https : //dotnetfiddle.net/hrAFsh