我有以下内容:
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
现在,在我的代码中,我正在尝试将JSON字符串映射到KeyValuePair
列表的实例,目前我正在按如下方式进行操作:
result =
@"{
"d": {
"OperationStatus": {
"IsSuccess": true,
"ErrorMessage": null,
"ErrorCode": null,
"InnerException": null
},
"List": [{
"key": "Key1",
"value": "Value1"
}, {
"key": "Key2",
"value": "Value2"
}]
}
}"
尝试#1
JavaScriptSerializer serializer = new JavaScriptSerializer();
KeyValuePairList output = serializer.Deserialize<KeyValuePairList>(result);
但是,这不起作用,因为KeyValuePairList
的构造函数没有使用任何参数进行调用。如果删除该构造函数,JSON序列化将失败,并返回错误No parameterless constructor found
。如何告诉KeyValuePairList
在其调用中使用KeyValuePair
作为模板?或者,我如何调整JSON序列化程序以实现此目的?
尝试#2
我也尝试了JSON.net
,如下所示:
var oo = JsonConvert.DeserializeObject<KeyValuePairList>(result);
关于如何使这项工作发挥作用,有什么建议吗?
实际上,解决方案比我想象的要简单。问题是服务器正在返回带有根节点d
的JSON字符串。因此,反序列化失败,因为它不知道如何处理根节点d
。这可以通过以下方式解决:
步骤1:添加一个额外的类JSONWrapper,用于包装传入的JSON字符串:
public class JSONWrapper<T> where T:class
{
public T d {set; get;}
}
步骤2:使用这个新类而不是进行反序列化
JavaScriptSerializer serializer = new JavaScriptSerializer();
var oo = serializer.Deserialize<JsonWrapper<KeyValuePairList>>(result);
更符合我的整个逻辑,所以我不必做出任何重大改变。感谢所有帮助我度过宝贵时光的人。
尝试T[]
而不是List<T>
你应该有两个属性作为,
public T[] Items{
get{
return ItemList.ToArray();
}
set{
ItemList.Clear();
ItemList.AddRange(value);
}
}
[ScriptIgnore]
public List<T> ItemList {get;set;}
作为数组的项将在JSON中序列化,您可以使用ItemList进行其他操作。