Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在泛型的情况下使JSON反序列化工作?_C#_Json_Json.net - Fatal编程技术网

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);