首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何反序列化具有包含不同对象的属性的json?

如何反序列化具有包含不同对象的属性的json?
EN

Stack Overflow用户
提问于 2017-09-09 17:20:13
回答 3查看 438关注 0票数 2

我目前正在为.NET开发一个Zoho图书API客户端,以便在我的组织中集成一些数据。我一直在努力反序列化API返回的json。问题在于继承和不同的属性名称。我想我正在考虑创建一个自定义转换器,以避免为了几个不同的字段而为每个模型创建响应类型。

我能够创建一个自定义转换器,该转换器适用于如下所示的父响应:

代码语言:javascript
复制
{
     "code" : 0,
     "message" : "success",
     "invoice" : { // This field varies by model
         "invoice_id" : "..."
     }
}

我已经为这个自定义转换器创建了要点

自定义转换器的问题之一是,当我从web客户端向下传递泛型返回类型时,我需要它以基本响应格式或分页响应格式进行,并且泛型在这里失败了。我的转换器不适用于分页响应。

我定义了基本类型的ZohoBooks响应如下:

代码语言:javascript
复制
namespace ZohoBooks4Net.Responses
{
    public class ZohoBooksResponse<T> : IZohoBooksResponse<T>
    {
        /// <summary>
        /// Zoho Books error code. This will be zero for a success response and non-zero in case of an error.
        /// </summary>

        [JsonProperty("code")]
        public int Code { get; set; }

        /// <summary>
        /// Message for the invoked API.
        /// </summary>

        [JsonProperty("message")]
        public string Message { get; set; }

        /// <summary>
        /// Comprises the invoked API’s Data.
        /// </summary>
        public T Resource { get; set; }
    }
}

资源是响应中的第三个字段。

但是,当响应作为分页返回时,它会添加另一个字段。

代码语言:javascript
复制
{
  "code": 0,
  "message": "success",
  "contacts": [
    { "..." }
  ],
  "page_context": {
    "page": 1,
    "per_page": 200,
    "has_more_page": false,
    "applied_filter": "Status.All",
    "sort_column": "contact_name",
    "sort_order": "D"
  }
}

所以我创建了一个对象来描述它:

代码语言:javascript
复制
namespace ZohoBooks4Net.Responses.PaginatedResponses
{
    public class PaginatedResponse<T> : ZohoBooksResponse<T>, IPaginatedResponse<T>
    {
        [JsonProperty("page_context")]
        public PageContext Context { get; set; }
    }

    public class PageContext
    {
        [JsonProperty("page")]
        public int Page { get; set; }

        [JsonProperty("per_page")]
        public int PerPage { get; set; }

        [JsonProperty("has_more_page")]
        public bool HasMorePage { get; set; }
    }
}

如果有人有任何解决办法,我会非常感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-12 14:46:14

我从一个评论者那里获取一个参考帖子,实现了本文海报创建的ReadJson方法。这解决了我的问题。这里有一个指向Github上的DynamicPropertyNameConverter的链接。

票数 0
EN

Stack Overflow用户

发布于 2017-09-10 12:56:02

书籍已经在github中托管了github库。在订阅java客户端中,页面上下文和资源分别处理。

票数 1
EN

Stack Overflow用户

发布于 2017-09-09 17:39:35

您试过使用json2csharp web应用程序工具吗?它将从您的JSON响应和一个根对象创建所需的类,这个对象可以与Newtonsoft的DeserializeObject方法一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46133217

复制
相关文章

相似问题

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