2017-12-18 24 views
0

我做了一個自定義JSON轉換器來處理我收到的JSON,但我有一些解析嵌套對象列表的麻煩。我的JSON目前看起來像這樣:反序列化自定義JsonConverter中的嵌套對象列表

JSON: 

{ 
"messageID": "1", 
"item": 
    { "type": "text", 
    "textlist": [ { "text": "just some text" }] 
    } 
} 

在我的情況下,我創建了幾個類可以轉換爲。我有一個消息類應用轉換器的項目。 item屬性是一個接口,它具有TextItem類形式的實現。

public class Message 
    { 
    [JsonProperty("messageID")] 
    public string messageID { get; set; } 

    [JsonConverter(typeof(ItemConverter))] 
    public IItem item { get; set; } 

    public Message(string msgID, IItem itm) 
    { 
     messageID = msgID; 
     item = itm; 
    } 
} 

public class TextItem : IItem 
{ 
    [JsonProperty("type")] 
    public string type { get; set; } 
    [JsonProperty("textlist")] 
    public List<Text> textlist { get; set; } 

    string IItem.Type 
    { 
     get => type; 
     set => type = value; 
    } 

    public TextItem(List<Text> txtlst) 
    { 
     type = "text"; 
     textlist = txtlst; 
    } 
} 

public class Text 
{ 
    [JsonProperty("text")] 
    public string text { get; set; } 

    public Text(string txt) 
    { 
     text = txt; 
    } 
} 

有相當多的不同類型的項目,這就是爲什麼我有ItemConverter:

public class ItemConverter : JsonConverter 
    { 
     public override object ReadJson(JsonReader reader, 
     Type objectType, object existingValue, 
     JsonSerializer serializer) 
    { 
     var jsonObject = JObject.Load(reader); 
     var item= default(IItem); 
     switch (jsonObject["type"].Value<string>()) 
     { 
      case "text": 
       item= new TextItem(jsonObject["textlist"].Value<List<Text>>()); 
       break; 
    // omitted non relevant cases 
     } 

     serializer.Populate(jsonObject.CreateReader(), item); 
     return item; 
    } 
} 

然而,調用DeserializeObject只會導致錯誤

JsonConvert.DeserializeObject<Message>(userMessage) 

// I get the following error: 
System.ArgumentNullException: Value cannot be null. 

所有我的其他案例(沒有列表)處理得很好。關於爲什麼嵌套列表未正確轉換的任何想法?

回答

0

你的類都搞砸了,

使用public string type { get; set; }讓你的項目,你需要

你的類可能是這個樣子

public class Textlist 
{ 
    public string text { get; set; } 
} 

public class Item 
{ 
    public string type { get; set; } 
    public List<Textlist> textlist { get; set; } 
} 

public class RootObject 
{ 
    public string messageID { get; set; } 
    public Item item { get; set; } 
} 

,現在你可以在RootObject

反序列化
+0

我按照你所描述的修復了我的課程(也在原始文章中更新了它)。它仍然產生相同的結果。 – Tippi

+0

犯了小錯,這是正確的答案 – Tippi

相關問題