我正在与第三方电子学习平台进行一些集成,该平台将根据我宁静的API调用的功能以不同的模式返回各种响应。由于这些响应以几种不同的模式返回,因此我尝试创建一系列响应对象类,这些对象类继承了一个基础Response
对象类,该对象类将包含常见的JSON部分(即“数据”和“消息”)并允许每个响应对象根据返回的响应覆盖或具有其他成员/类。
以下是有关架构如何不同的几个示例。
类创建返回:
{
"data": [
{
"row_index": 0,
"success": true,
"message": "string"
}
]
}
用户创建返回:
{
"data": [
{
"message": [
{
"id": "string",
"message": "string"
}
],
"success": true,
"user_id": 0
}
]
}
如您所见,不同的响应具有不同的模式。类创建仅返回数据对象内的message
成员,而用户创建共有一个单独的message
对象。
由于由于含糊不清,我在每个对象中都没有一个名为data
的类,因此我想我需要创建一个包含公共成员的基本响应对象,并允许我覆盖或添加视需要飞行。
我试图创建一个基类:
public class BaseResponse
{
public List<Data> data;
public class Data
{
public bool success { set; get; }
}
}
以及示例派生类:
public class ClassroomResponse : BaseResponse
{
public class Data
{
public int row_index { get; set; }
public string message { get; set; }
}
}
我不确定这是否仅适用于函数而不是类(如我在上面尝试的那样)?有没有一种方法可以将其他成员添加到派生对象的对象中(row_index
和message
不是所有响应的成员,所以我希望能够根据需要获取这些成员)
答案 0 :(得分:2)
您可以为每种类型创建单独的,不同的类,根据您未显示的其他变体,此处可能是正确的选择。或者您可以使用泛型。您可以通过多种方式来执行此操作,但这是您可以执行的一种方式。
总体响应的基类:
public abstract class Response<TData>
{
[JsonProperty("data")]
public TData Data { get; set; }
}
数据对象的基类:
public abstract class BaseData<TMessage>
{
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("message")]
public TMessage Message { get; set; }
}
用于创建类的响应类型:
public class ClassData : BaseData<string>
{
[JsonProperty("row_index")]
public int RowIndex { get; set; }
}
用户创建的响应类型:
public class UserData : BaseData<UserMessage>
{
[JsonProperty("user_id")]
public int UserId { get; set; }
}
public class UserMessage
{
[JsonProperty("id")]
public int Id { get; set; }
[JsonProperty("message")]
public string Message { get; set; }
}
最后是整体响应类型:
public class ClassResponse : Response<ClassData>
{ }
public class UserResponse : Response<UserData>
{ }
现在您可以像平常一样使用对象了
var classData = new ClassResponse {Data = new ClassData {Message = ""}};
var classJson = JsonConvert.SerializeObject(classData);
var userData = new UserResponse {Data = new UserData {Message = new UserMessage {Message = ""}}};
var userJson = JsonConvert.SerializeObject(userData);
答案 1 :(得分:1)
我将遵循通用路线
假设我们对 Class 创建的回复为
public class ClassResponseObject {
public int row_index { get; set; }
public bool success { get; set; }
public string message { get; set; };
}
,并创建 User :
public class UserResponseObject {
public int user_id { get; set; }
public bool success { get; set; }
public MessageResponseObject message { get; set; };
}
以及消息
public class MessageResponseObject {
public string id { get; set; }
public string message { get; set; };
}
看到上面的代码后,我们可以发现我们在两个响应中都具有成功属性,因此让我们创建一个具有该属性的基类,并从中继承这些类。
public class BaseResponseObject {
public bool success { get; set; }
}
public class ClassResponseObject : BaseResponseObject {
public int row_index { get; set; }
public string message { get; set; };
}
public class UserResponseObject : BaseResponseObject {
public int user_id { get; set; }
public MessageResponseObject message { get; set; };
}
在这一点上,我们看到的另一个常见属性是消息,但是两者都有不同的类型。这可以通过使用泛型来解决。我正在考虑响应的message属性可能有更多类型,但是无论哪种情况都应该起作用。
为此,请修改我们的 BaseResponseObject 并将消息属性移到此处
public class BaseResponseObject<TMessage> {
public bool success { get; set; }
public TMessage message { get; set; }
}
所以我们的响应对象将变成这样:
public class ClassResponseObject : BaseResponseObject<String> {
public int row_index { get; set; }
}
public class UserResponseObject : BaseResponseObject<MessageResponseObject> {
public int user_id { get; set; }
}
最后一步,我们需要为实际响应定义最终的类
public class APIResponse<TResponse> {
public List<TResponse> data { get; set; }
}
现在,当您捕获 Class 创建的响应时,您只需在
中捕获它APIResponse<ClassResponseObject>
与用户创建类似,将其捕获
APIResponse<UserResponseObject>
我希望这会有所帮助。