繁体   English   中英

具有多个类构造函数的 C# Json 反序列化

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM