我目前正在为.NET开发一个Zoho图书API客户端,以便在我的组织中集成一些数据。我一直在努力反序列化API返回的json。问题在于继承和不同的属性名称。我想我正在考虑创建一个自定义转换器,以避免为了几个不同的字段而为每个模型创建响应类型。
我能够创建一个自定义转换器,该转换器适用于如下所示的父响应:
{
"code" : 0,
"message" : "success",
"invoice" : { // This field varies by model
"invoice_id" : "..."
}
}我已经为这个自定义转换器创建了要点。
自定义转换器的问题之一是,当我从web客户端向下传递泛型返回类型时,我需要它以基本响应格式或分页响应格式进行,并且泛型在这里失败了。我的转换器不适用于分页响应。
我定义了基本类型的ZohoBooks响应如下:
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; }
}
}如果有人有任何解决办法,我会非常感激的。
发布于 2017-09-12 14:46:14
我从一个评论者那里获取一个参考帖子,实现了本文海报创建的ReadJson方法。这解决了我的问题。这里有一个指向Github上的DynamicPropertyNameConverter的链接。
发布于 2017-09-09 17:39:35
您试过使用json2csharp web应用程序工具吗?它将从您的JSON响应和一个根对象创建所需的类,这个对象可以与Newtonsoft的DeserializeObject方法一起使用。
https://stackoverflow.com/questions/46133217
复制相似问题