使用相同的答案 属性 名称反序列化 JSON 但内部属性不同

Deserialize JSON with same answer property name but differents properties inside

我正在实施一个外部 API,如果可以,他会给我这样的回复:

{
    status: "success",
    answer: {
        token: "tokenGenerated..."
    }
}

或者如果我得到一个错误,像这样:

{
    status: "ERROR",
    answer: {
        errorCode: "error code"
        errorMessage: "error message"
    }
}

我正在尝试反序列化两种不同的响应 class,一种用于 OK 响应,另一种用于 ERROR 响应。我正在做这样的事情:

public class Response
{
    [JsonProperty("status")]
    private string Status { get; set; }
    public bool IsSuccess => Status != "ERROR";
    
    [JsonProperty("answer")]
    public object Response { get; set; }
}

public class ResponseError : Response
{
    [JsonProperty("errorCode")]
    public string ErrorCode { get; set; }

    [JsonProperty("errorMessage")]
    public string ErrorMessage { get; set; }
}

public class ResponseOk : Response
{
    [JsonProperty("token")]
    public string Token { get; set; }
}

当我收到回复时,我会这样做:

var readResponse = await response.Content.ReadAsStringAsync();                    
var deserializedResponse = JsonConvert.DeserializeObject<Response>(readResponse);
if (deserializedResponse.IsSuccess)
    return JsonConvert.DeserializeObject<ResponseOk>(readResponse);
else
    return JsonConvert.DeserializeObject<ResponseError>(readResponse);

在我的方法中,我 return 一个对象。 我的问题是,例如,如果我获得 OK 状态,属性 状态得到很好的实施,并且在响应 属性 中我得到“token:”tokenhere“”,而不是在 Token 属性.

如果我尝试在 Resposne class 中放入令牌 属性 和错误属性,我需要在这两种情况下应用 JsonProperty("answer"),当然我得到一个例外。

对于我的案例,有更好的方法来实现这个吗? 谢谢

您将 JSON 中的 answer 对象映射到 Response class 中的 Response 属性。

有这个class:

public class ResponseOk : Response
{
    [JsonProperty("token")]
    public string Token { get; set; }
}

你期望 JSON 中的 token 属性 作为根 属性,但你在 answer 中有 token 所以这个映射赢了没用。

当您遇到错误时,您将遇到同样的问题 - ErrorCodeErrorMessage 也不会被设置,因为您将它们映射到根属性。

您可以将 classes 更改为:

public class Response
{
    [JsonProperty("status")]
    private string Status { get; set; }
    public bool IsSuccess => Status != "ERROR";
    
    [JsonProperty("answer")]
    public Answer Response { get; set; } // can be just renamed to "Answer"
}

public class Answer
{
    [JsonProperty("errorCode")]
    public string ErrorCode { get; set; }

    [JsonProperty("errorMessage")]
    public string ErrorMessage { get; set; }

    [JsonProperty("token")]
    public string Token { get; set; }
}

现在您可以检查 Response class 中的 IsSuccess 并决定使用什么 - Token 或错误属性。

您可以这样定义您的 类(尚未测试):

public class Response
{
    [JsonProperty("status")]
    private string Status { get; set; }
    public bool IsSuccess => Status != "ERROR";
}

public class ResponseError : Response
{
    [JsonProperty("answer")]
    public ResponseErrorContent answer { get; set; }
}

public class ResponseErrorContent
{
    [JsonProperty("errorCode")]
    public string ErrorCode { get; set; }

    [JsonProperty("errorMessage")]
    public string ErrorMessage { get; set; }
}

public class ResponseOk : Response
{
    [JsonProperty("answer")]
    public ResponseOkContent answer { get; set; }
}

public class ResponseOkContent
{
    [JsonProperty("token")]
    public string Token { get; set; }
}