我正在编写一个控制台应用程序来从第三方API检索JSON数据。我无法控制API的数据结构或功能。
我进行的几个调用将返回多个“页面”数据。数据是特定类型的对象的集合,例如用户。
我已经在我的应用程序中创建了类来匹配API中的各种数据类型。
public class User
{
[JsonProperty("id")]
public int ID { get; set; }
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
}
public class FooBar
{
[JsonProperty("foo")]
public string Foo { get; set; }
[JsonProperty("bar")]
public string Bar { get; set; }
}
对于这些调用,API响应始终采用相同的格式。而"data“数组中的实际对象类型将根据所进行的调用而不同。
{
"paging":{"page":1},
"data":[{<object>}, {<object>}, {<object>},...]
}
我已经创建了一个类来尝试反序列化这些。Data属性的dynamic[]类型用于说明目的,如果有更好的方法,我很乐意更改它。
public class ApiResponseObject
{
[JsonProperty("paging")]
public Paging PagingInfo { get; set; }
[JsonProperty("data")]
public dynamic[] Data { get; set; }
}
我希望将数据集合解析为它所包含的对象的适当类型。例如:
string userJson = "{\"paging\":{\"page\":1},\"data\":[{\"id\":1,\"first_name\":\"Joe\",\"last_name\":\"Bloggs\"},{\"id\":2,\"first_name\":\"Jane\",\"last_name\":\"Doe\"}]}"; // json string would come from API
string foobarJson = "{\"paging\":{\"page\":1},\"data\":[{\"foo\":\"Lorem\",\"bar\":\"Ipsum\"},{\"foo\":\"Dolor\",\"bar\":\"Amet\"}]}";
var userResponse = JsonConvert.DeserializeObject<ApiResponseObject>(userJson);
var foobarResponse = JsonConvert.DeserializeObject<ApiResponseObject>(foobarJson);
反序列化成功,但数据集合的类型为JObject,无法转换为正确的类型(User、FooBar)。
如果可能的话,我尽量避免为每个请求编写特定的响应对象类。
当我请求它的时候,我会知道在集合中我期望的是什么类型的对象,所以我可以将该类型传递给反序列化程序,但我不清楚在这个特定的场景中如何实现。类似下面的psuedo代码将是理想的。
var userResponse = JsonConvert.DeserializeObject<ApiResponseObject<User>>(userJson);
谢谢你的帮忙!
发布于 2019-07-29 09:40:37
您可以使用泛型类型T,如下所示:
public class ApiResponseObject<T>
{
[JsonProperty("paging")]
public Paging PagingInfo { get; set; }
[JsonProperty("data")]
public T[] Data { get; set; }
}
https://stackoverflow.com/questions/57250958
复制相似问题