我有一个有趣的问题,我的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
吗?我不想在编译时使用动态我不会知道所有可能性。基本上,一旦我有了字典,我就可以在运行时循环和映射我需要的地方。
答案 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;
}
当然,适应方法将包含您的检查逻辑(例如,如果所有问题都在字典中,则会失败等。)