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

时间:2017-09-09 17:20:13

标签: c# json json.net

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

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

{
     "code" : 0,
     "message" : "success",
     "invoice" : { // This field varies by model
         "invoice_id" : "..."
     }
}

我为此自定义转换器创建了a gist

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

我将ZohoBooks Response的基本类型定义为:

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

资源就是我所说的响应中的第三个字段。

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

{
  "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"
  }
}

所以我创建了这个描述它的对象:

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

如果有人有任何解决方案我会非常感激。

3 个答案:

答案 0 :(得分:1)

已在github中托管.Net库的图书。在Subscription java client中,页面上下文和资源单独处理。

答案 1 :(得分:0)

您是否尝试过使用json2csharp Web应用程序工具?它将创建JSON响应所需的类和一个可以与Newtonsoft JsonCovnert的DeserializeObject方法一起使用的根对象。

答案 2 :(得分:0)

从评论者那里获取referenced post,我实现了文章海报创建的ReadJson方法。这解决了我的问题。这是Github Gist上DynamicPropertyNameConverter的链接。