2015-12-08 96 views
0

我試圖用NewtonSoft JsonConvert轉換ListItemCollectionWeb Servicelistitemcollection jsonconvert serializeObject失敗

[WebMethod(EnableSession = true)] 
    public string TestNewtonSoft() 
    { 

     System.Web.UI.WebControls.ListItemCollection coll = new System.Web.UI.WebControls.ListItemCollection(); 

     coll.Add(new System.Web.UI.WebControls.ListItem("item one", "1")); 
     coll.Add(new System.Web.UI.WebControls.ListItem("item two", "2")); 
     coll.Add(new System.Web.UI.WebControls.ListItem("item three", "3")); 
     coll.Add(new System.Web.UI.WebControls.ListItem("item four", "4")); 
     coll.Add(new System.Web.UI.WebControls.ListItem("item five", "5")); 

     string aList = Newtonsoft.Json.JsonConvert.SerializeObject(coll); 
     return aList; 

    } 

結果集是

["item one","item two","item three","item four","item five"] 

文本包含,值丟失。任何想法爲什麼發生這種情況?

回答

1

我想我知道這是爲什麼發生:)。

它是因爲該列表是一個IEnumerable無類型。
這意味着,當Json.Net循環遍歷項目時,它只是獲取對象列表,並且當它序列化一個對象時,它將使用ToString()方法,該方法將返回ListItemText

希望讓事情更清楚。

您可以編寫一個JsonConverter來處理序列化。
這應該給你或多或少你想要的。

public class Json_34159840 
{   
    public static void CollectionFails() 
    { 
     JsonConvert.DefaultSettings =() => new JsonSerializerSettings 
     { 
      Converters = new List<JsonConverter> { new ListItemConverter() } 
     }; 

     var coll = new ListItemCollection(); 

     coll.Add(new ListItem("item one", "1")); 
     coll.Add(new ListItem("item two", "2")); 
     coll.Add(new ListItem("item three", "3")); 
     coll.Add(new ListItem("item four", "4")); 
     coll.Add(new ListItem("item five", "5")); 

     var aList = JsonConvert.SerializeObject(coll); 
     Console.WriteLine(aList); 
    } 
} 

public class ListItemConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var item = (ListItem)value; 

     writer.WriteStartObject(); 

     writer.WritePropertyName("Text"); 
     writer.WriteValue(item.Text); 

     writer.WritePropertyName("Value"); 
     writer.WriteValue(item.Value); 

     writer.WriteEndObject(); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

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

這將輸出

[ 
{"Text":"item one","Value":"1"}, 
{"Text":"item two","Value":"2"}, 
{"Text":"item three","Value":"3"}, 
{"Text":"item four","Value":"4"}, 
{"Text":"item five","Value":"5"} 
] 

請注意,我沒有做過的反序列化。

+0

我實際上最終將集合轉換爲List 。我想我的問題和我驚訝的是,當我沒有任何問題序列化更復雜的項目時,它爲什麼不能開箱即用。 – Bindrid