C# 在泛型的情况下使JSON反序列化工作?
我有以下资料:C# 在泛型的情况下使JSON反序列化工作?,c#,json,json.net,C#,Json,Json.net,我有以下资料: public class BaseEntity<T> where T: class { public OperationStatus OperationStatus { set; get; } public List<T> List { set; get; } protected internal BaseEntity() { if (OperationStatus == null) {
public class BaseEntity<T> where T: class
{
public OperationStatus OperationStatus { set; get; }
public List<T> List { set; get; }
protected internal BaseEntity()
{
if (OperationStatus == null)
{
OperationStatus = new OperationStatus();
OperationStatus.IsSuccess = true;
}
this.List = new List<T>();
}
internal BaseEntity(IEnumerable<T> list)
{
if (OperationStatus == null)
{
OperationStatus = new OperationStatus();
OperationStatus.IsSuccess = true;
}
this.List = new List<T>();
foreach (T k in list)
{
this.List.Add(k);
}
}
}
public class KeyValuePair
{
public string key;
public string value;
}
public class KeyValuePairList : BaseEntity<KeyValuePair>
{
public KeyValuePairList() { }
public KeyValuePairList(IEnumerable<KeyValuePair> list)
: base(list) { }
}
// Multiple other classes like KeyValuePair but all have the
// same behavior so they have been derived from BaseEntity
尝试#1
JavaScriptSerializer serializer = new JavaScriptSerializer();
KeyValuePairList output = serializer.Deserialize<KeyValuePairList>(result);
关于如何使这项工作有效,有什么建议吗?尝试
T[]
而不是List
你应该有两个属性
public T[] Items{
get{
return ItemList.ToArray();
}
set{
ItemList.Clear();
ItemList.AddRange(value);
}
}
[ScriptIgnore]
public List<T> ItemList {get;set;}
public T[]项{
得到{
返回ItemList.ToArray();
}
设置{
ItemList.Clear();
ItemList.AddRange(值);
}
}
[脚本忽略]
公共列表项列表{get;set;}
作为数组的项将在JSON中序列化,您可以使用ItemList进行其他操作 实际上,解决方案比我想象的要简单。问题是服务器返回的JSON字符串带有根节点
d
。因此,反序列化失败,因为它不知道如何处理根节点d
。这可以通过以下方式解决:
步骤1:添加一个额外的类JSONWrapper,用于包装传入的JSON字符串:
public class JSONWrapper<T> where T:class
{
public T d {set; get;}
}
公共类JSONWrapper,其中T:class
{
公共td{set;get;}
}
第2步:改用这个新类反序列化
JavaScriptSerializer serializer = new JavaScriptSerializer();
var oo = serializer.Deserialize<JsonWrapper<KeyValuePairList>>(result);
JavaScriptSerializer serializer=新的JavaScriptSerializer();
var oo=序列化程序。反序列化(结果);
更符合我的整体逻辑,所以我不必做任何重大改变。感谢所有用宝贵时间帮助我的人。谢谢。再清楚一点就好了。因为我以前使用的是
List
,所以我可以使用List的Add
方法。此修改将破坏现有代码(构造函数中我向列表中添加元素的部分)。有解决办法吗?好的,你的问题,你的解决方案。但对我来说,反序列化一个简单的json代码太多了。
public class JSONWrapper<T> where T:class
{
public T d {set; get;}
}
JavaScriptSerializer serializer = new JavaScriptSerializer();
var oo = serializer.Deserialize<JsonWrapper<KeyValuePairList>>(result);