我目前正在为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; }
}
}
如果有人有任何解决方案我会非常感激。
答案 0 :(得分:1)
已在github中托管.Net库的图书。在Subscription java client中,页面上下文和资源单独处理。
答案 1 :(得分:0)
您是否尝试过使用json2csharp Web应用程序工具?它将创建JSON响应所需的类和一个可以与Newtonsoft JsonCovnert的DeserializeObject方法一起使用的根对象。
答案 2 :(得分:0)
从评论者那里获取referenced post,我实现了文章海报创建的ReadJson方法。这解决了我的问题。这是Github Gist上DynamicPropertyNameConverter的链接。