我正在使用Json.NET反序列化来自第三方Restful API的响应(对此没有控制权,不幸的是,不能使用其他API)。该API返回响应对象或错误对象。
此刻,我的响应对象和错误对象都继承自基础对象,然后反序列化为该基础对象,然后转换为它的类型。
var response = JsonConvert.DeserializeObject<BaseMessage>(responseContent);
switch (response)
{
case ResponseMessage responseMessage:
return responseMessage;
case ErrorMessage error:
return error;
}
ResponseMessage
和ErrorMessage
完全不同,也不包含说明其类型的字段。我只是从模式中知道。想象一下,他们就像下面这样。
public class BaseMessage
{
}
public class ResponseMessage : BaseMessage
{
public string Status { get; set; }
public string Reference { get; set; }
}
public class ErrorMessage : BaseMessage
{
public string ErrorCode { get; set; }
public string ErrorMessage { get; set; }
}
它们都继承自BaseMessage的唯一原因是,我可以反序列化为该类型,然后转换为实际应具有的类型。
是否有更好的方法知道JSON应该反序列化到哪个对象?
答案 0 :(得分:0)
我通常会做出如下标准答复:
为成功:
{
"status": 200,
"message": "Stored Successfully!",
"result" : {
"some_attr": "some value",
}
}
对于失败:
{
"status": 302, //or any other standard response code
"message": "Token missing", //Any other error message
"result" : {
// error object or empty result if no need to add details to error.
}
}
所以现在您所需要做的就是反序列化/序列化为看起来像这样的对象:
int status;
string message;
dynamic result;
您将获得其余的场景。
编辑:
对于不支持这种格式且无法控制的API,您可以在成功对象中选择一个属性,以使用JObject
手动检查其是否存在。
或者尝试反序列化为success object
,反之则反序列化为error object
(这感觉有点hacky,但是不提供标准HTTP Response
的第三方api会迫使您无论如何都要使用此类技巧。
答案 1 :(得分:0)
在反序列化为所需类型之前,您可能需要先检查响应
//...
var response = JObject.Parse(responseContent);
if (response.ContainsKey("ErrorCode")) { //Or what ever the actual key is
return response.ToObject<ErrorMessage>();
}
if (response.ContainsKey("Status")) { //Or what ever the actual key is
return response.ToObject<ResponseMessage>();
}
//...
以上方法使用JObject
解析响应并检查密钥以确定解析响应的类型。