在泛型的情况下使JSON反序列化工作



我有以下内容:

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进行其他操作。

相关内容

  • 没有找到相关文章

最新更新