使用相同的答案 属性 名称反序列化 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
所以这个映射赢了没用。
当您遇到错误时,您将遇到同样的问题 - ErrorCode
和 ErrorMessage
也不会被设置,因为您将它们映射到根属性。
您可以将 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; }
}
我正在实施一个外部 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
所以这个映射赢了没用。
当您遇到错误时,您将遇到同样的问题 - ErrorCode
和 ErrorMessage
也不会被设置,因为您将它们映射到根属性。
您可以将 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; }
}