首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >listitemcollection jsonconvert serializeObject失败

listitemcollection jsonconvert serializeObject失败
EN

Stack Overflow用户
提问于 2015-12-09 00:28:51
回答 1查看 813关注 0票数 0

我尝试使用NewtonSoft JsonConvertListItemCollection转换为Web Service

代码语言:javascript
复制
 [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;

    }

结果集是

代码语言:javascript
复制
["item one","item two","item three","item four","item five"]

如果包含文本,则会丢失值。你知道为什么会发生这种情况吗?

EN

回答 1

Stack Overflow用户

发布于 2015-12-09 00:54:03

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

这是因为列表是一个非类型化的IEnumerable

这意味着当Json.Net遍历这些项时,它只得到一个对象列表,而当它序列化一个对象时,它将使用ToString()方法,该方法将返回ListItemText

希望这能让事情变得更清楚。

您可以编写一个JsonConverter来处理序列化。

这应该或多或少会给你想要的东西。

代码语言:javascript
复制
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);
    }
}

这将输出

代码语言:javascript
复制
[
 {"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"}
]

请注意,我还没有进行反序列化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34161031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档