Json.NET反序列化许多对象之一

时间:2019-02-20 22:33:46

标签: c# json.net

我正在使用Json.NET反序列化来自第三方Restful API的响应(对此没有控制权,不幸的是,不能使用其他API)。该API返回响应对象或错误对象。

此刻,我的响应对象和错误对象都继承自基础对象,然后反序列化为该基础对象,然后转换为它的类型。

var response = JsonConvert.DeserializeObject<BaseMessage>(responseContent);

switch (response)
{
    case ResponseMessage responseMessage:
        return responseMessage;
    case ErrorMessage error:
        return error;
}

ResponseMessageErrorMessage完全不同,也不包含说明其类型的字段。我只是从模式中知道。想象一下,他们就像下面这样。

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应该反序列化到哪个对象?

2 个答案:

答案 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解析响应并检查密钥以确定解析响应的类型。