2017-08-08 67 views
2

我有以下類定義:Newtonsoft JsonConvert.DeserializeObject如何忽略空物體

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; } 
} 

從數據庫中,我得到以下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 
} 

當我現在在做一個JsonConvert.DeserializeObject<Wiki>(json)我得到一個具有值爲1的標籤列表的Wiki對象TagId: null, TagText: null and CreatedOn: "0001-01-01T00:00:00"

有沒有辦法在反序列化時忽略空的Tag對象?我嘗試了幾個JsonSerializerSettings,但沒有任何幫助。

+0

我不明白你的問題...你想忽略整個對象,還是隻有「標籤」屬性? –

+0

如果您只想忽略「標籤」屬性,那麼您遇到問題,因爲您的類「Wiki」包含屬性「標籤」。如果你真的想忽略這個屬性,你必須聲明兩個「Wiki」類:一個帶有「Tags」屬性,另一個沒有「Tags」屬性。然後你必須檢查JSON字符串是否包含像「[{}]」的字符串。如果它包含「[{}]」,那麼「標籤」是空的,您可以在沒有「標籤」屬性的情況下使用該類進行反序列化。如果要永遠刪除「標籤」,則可以刪除「標籤「你的」維基「類的財產,它應該工作。 –

+0

有沒有可能在解析之前預處理字符串?像:jsonStringFromDb.Replace(「{}」,「」) – Artem

回答

4

您可以使用自定義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(); 
    } 
} 

要使用轉換器,只需添加一個[JsonConverter]屬性您Tags屬性是這樣的:

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

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

2

您必須檢測轉換後的空標記對象,並自己將其刪除。從解串器的角度來看,{}是完全有效且完整的Tag對象,其屬性全部未設置。

類似下面應該工作(假定C#6):

Wiki wiki = JsonConvert.DeserializeObject<Wiki>(json); 
wiki.Tags = Wiki.Tags?.Where(x => x.TagId.HasValue)?.ToList();