0

我有一个有趣的问题,即我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吗?我不想在编译时使用动态,因为我不知道所有的可能性。基本上,一旦我有了字典,我就可以在运行时循环和映射我需要的位置。

4

1 回答 1

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

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

于 2013-11-01T12:33:17.473 回答