[英]C# Json Deserialization with multiple class constructors
根据我查询的许可证,我得到两个不同的 JSON 响应。 成功时我得到“成功”字符串,错误时我得到“代码”字符串。 现在,我构建了一个两个构造函数类来捕获这两种情况。
当我反序列化 json 字符串时:
License license = JsonConvert.DeserializeObject<License>(json_str);
我收到错误消息: "Unable to find a constructor to use for type..."
这是代码,任何建议:
//JSON String on Success -> {"success":true,"data":{"id":54,"orderId":109,"productId":79,"userId":1,"licenseKey":"1y10a3P-YL-A1-EQ-F9-GI-DM-W3","expiresAt":"2022-09-04 09:02:40","validFor":365,"source":1,"status":2,"timesActivated":null,"timesActivatedMax":1,"createdAt":"2021-09-04 09:02:40","createdBy":0,"updatedAt":"2021-09-04 09:02:40","updatedBy":0}}
//JSON String on error -> {"code":"lmfwc_rest_license_expired","message":"The license Key expired on 2021-10-06 00:00:00 (UTC).","data":{"status":405}}
public partial class License
{
[JsonProperty("success")]
public bool Success { get; set; }
[JsonProperty("data")]
public Success_Data Success_Data { get; set; }
[JsonProperty("code")]
public String Code { get; set; }
[JsonProperty("message")]
public String Message { get; set; }
[JsonProperty(PropertyName = "error_data")]
public Error_Data Error_Data { get; set; }
public License(bool success, Success_Data data)
{
Success = success;
Success_Data = data;
}
public License(String code, String message, Error_Data error_data)
{
Code = code;
Message = message;
Error_Data = error_data;
}
}
public partial class Error_Data
{
[JsonProperty("status")]
public long Status { get; set; }
}
public partial class Success_Data
{
[JsonProperty("id")]
public long Id { get; set; }
[JsonProperty("orderId")]
public long OrderId { get; set; }
[JsonProperty("productId")]
public long ProductId { get; set; }
[JsonProperty("userId")]
public long UserId { get; set; }
[JsonProperty("licenseKey")]
public string LicenseKey { get; set; }
[JsonProperty("expiresAt")]
public DateTimeOffset ExpiresAt { get; set; }
[JsonProperty("validFor")]
public object ValidFor { get; set; }
... }
您需要一个具有 [JsonConstructor] 属性的构造函数。 此代码经过测试并正常工作
[JsonConstructor]
public License(String code, String message, JToken data, bool? success = null)
{
if (success != null)
{
Success = (bool)success;
Success_Data = JsonConvert.DeserializeObject<Success_Data>(data.ToString());
}
else
{
Code = code;
Message = message;
Error_Data = JsonConvert.DeserializeObject<Error_Data>(data.ToString());
}
}
并删除 [JsonProperty(PropertyName = "error_data")] 因为没有这个 json 属性。 只留下
public Error_Data Error_Data { get; set; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.