listitemcollection jsonconvert serializeObject失败

时间:2015-12-08 16:28:51

标签: c# json.net

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

 [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 个答案:

答案 0 :(得分:1)

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

因为列表是IEnumerable无类型的 这意味着当Json.Net循环遍历项目时,它只获取一个对象列表,当它序列化一个对象时,它将使用ToString()方法,该方法将返回Text ListItem }。

希望能让事情更清晰。

您可以写一个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"}
]

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