我尝试使用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"]
包含文字,价值丢失。任何想法为什么会发生这种情况?
答案 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"}
]
请注意,我还没有完成反序列化。