我目前正在为Zoho Books API的.NET客户端工作,以便将某些数据集成到我的组织中。我一直在努力使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; }
}
}
如果有人有任何解决方案,我将非常感谢它。
已经在Github托管的.NET库。在订阅Java客户端,页面上下文和资源分别处理。
您是否尝试过使用JSON2CSHARP Web应用程序工具?它将从您的JSON响应中创建所需的类,以及可以与Newtonsoft Jsoncovnert的DeserializeObject方法一起使用的根对象。
从评论者那里获取引用的帖子,我实现了文章海报创建的readjson方法。这解决了我的问题。这是GitHub Gist上DynamicPropertynameconeconconverter的链接。