首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将JSON反序列化为具有IEnumerable<dynamic>类型属性的自定义类型?

如何将JSON反序列化为具有IEnumerable<dynamic>类型属性的自定义类型?
EN

Stack Overflow用户
提问于 2019-07-29 17:34:29
回答 1查看 85关注 0票数 0

我正在编写一个控制台应用程序来从第三方API检索JSON数据。我无法控制API的数据结构或功能。

我进行的几个调用将返回多个“页面”数据。数据是特定类型的对象的集合,例如用户。

我已经在我的应用程序中创建了类来匹配API中的各种数据类型。

代码语言:javascript
代码运行次数:0
运行
复制
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“数组中的实际对象类型将根据所进行的调用而不同。

代码语言:javascript
代码运行次数:0
运行
复制
{
 "paging":{"page":1},  
 "data":[{<object>}, {<object>}, {<object>},...]
}

我已经创建了一个类来尝试反序列化这些。Data属性的dynamic[]类型用于说明目的,如果有更好的方法,我很乐意更改它。

代码语言:javascript
代码运行次数:0
运行
复制
public class ApiResponseObject
{
    [JsonProperty("paging")]
    public Paging PagingInfo { get; set; }

    [JsonProperty("data")]
    public dynamic[] Data { get; set; }
}

我希望将数据集合解析为它所包含的对象的适当类型。例如:

代码语言:javascript
代码运行次数:0
运行
复制
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代码将是理想的。

代码语言:javascript
代码运行次数:0
运行
复制
var userResponse = JsonConvert.DeserializeObject<ApiResponseObject<User>>(userJson);

谢谢你的帮忙!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-29 17:40:37

您可以使用泛型类型T,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
public class ApiResponseObject<T>
{
    [JsonProperty("paging")]
    public Paging PagingInfo { get; set; }

    [JsonProperty("data")]
    public T[] Data { get; set; }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57250958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档