【问题标题】:listitemcollection jsonconvert serializeObject failslistitemcollection jsonconvert serializeObject 失败
【发布时间】:2015-12-09 01:00:59
【问题描述】:

我尝试使用NewtonSoft JsonConvertListItemCollection 转换为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"]

包含文本,丢失值。任何想法为什么会发生这种情况?

【问题讨论】:

    标签: c# json.net


    【解决方案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"}
    ]
    

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

    【讨论】:

    • 我实际上最终将集合转换为 List。我猜我的问题和我很惊讶为什么当我序列化更复杂的项目没有问题时它不能开箱即用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多