2015-12-08 62 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