listitemcollection jsonconvert serializeObject fails



我尝试使用NewtonSoft JsonConvert转换Web Service中的ListItemCollection

 [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"]

包含文本,丢失值。你知道为什么会这样吗?

我想我知道为什么会发生这种情况:)。

这是因为该列表是一个未键入的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"}
]

请注意,我还没有完成反序列化。

相关内容

  • 没有找到相关文章

最新更新