对字典进行重新锐化和反序列化

时间:2013-11-01 12:11:19

标签: c# dictionary restsharp json-deserialization

我有一个有趣的问题,我的JSON返回同一个URI调用,根据用户的ID可能略有不同。我不知道差异的所有组合,因为事情可能会随着时间而改变。例如,对同一URL的三个不同请求可以返回这三个不同的JSON表示。

{ "success":true, "total":1, "list":[{
    "uid":"24",
    "firstname":"Richard",
    "question1":"Y"}
]}

{ "success":true, "total":1, "list":[{
    "uid":"25",
    "firstname":"Fred",
    "question2":"Yes"}
]}

{ "success":true, "total":1, "list":[{
    "uid":"26",
    "firstname":"Bob",
    "surname":"Wilde",
    "question3":"Cat"}
]}

请注意,第一个调用包含Question1,第二个调用包含Question2,第三个调用包含surname and Question3

反序列化的代码如下所示: -

var result = client.Execute<ResultHeader<Customer>>(request);


public class ResultHeader<T>
{
    public bool Success { get; set; }
    public int Total { get; set; }
    public List<T> List { get; set; }
}

public class Customer
{
   public string Firstname { get; set; }  //This is always returned in the JSON

   //I am trying to get this...
   public Dictionary<string, string> RemainingItems { get; set; }
}

我要做的是要么返回ALL中包含的list字段的字典集合,这些集合不常见且未被反序列化或未能包含所有内容的字典在list。一些假设是,如果需要,列表中的所有值都可以被视为字符串。

这可以使用RESTSharp吗?我不想在编译时使用动态我不会知道所有可能性。基本上,一旦我有了字典,我就可以在运行时循环和映射我需要的地方。

1 个答案:

答案 0 :(得分:1)

我会做一个中间步骤:

var resultTmp = client.Execute<ResultHeader<Dictionary<string,string>>>(request);
var finalResult = AdaptResult(resultTmp);

AdaptResult可以按如下方式实施:

static ResultHeader<Customer> AdaptResult(
                         ResultHeader<Dictionary<string, string>> tmp)
{
    var res = new ResultHeader<Customer>();
    res.Success = tmp.Success;
    res.Total = tmp.Total;
    res.List = new List<Customer>();
    foreach (var el in tmp.List)
    {
        var cust = new Customer();
        cust.Firstname = el["Firstname"];
        cust.RemainingItems = 
            el.Where(x => x.Key != "Firstname")
              .ToDictionary(x => x.Key, x => x.Value);
        res.List.Add(cust);
    }
    return res;
}

当然,适应方法将包含您的检查逻辑(例如,如果所有问题都在字典中,则会失败等。)