我尝试使用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()
方法,该方法将返回ListItem
的Text
。
希望这能让事情变得更清楚。
您可以编写一个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"}
]
请注意,我还没有完成反序列化。