首页 > 解决方案 > 将 JSON 属性反序列化为不同的类属性

问题描述

我收到来自第 3 方的类型不明确的 API 响应。对于某些方法,它是:

{"error":{"message":"Resource is already part of this app","status_code":400}}

在其他电话中,它是:

{"error": "Resource is already part of this app" }

是否可以将此类响应反序列化为:

public class Response
{
    [JsonProperty("error")]
    public string Error { get; set; }

    [JsonIgnore] //[JsonProperty("error")]
    public ObjectError ObjectError { get; set; }
}

public class ObjectError
{
    [JsonProperty("message")]
    public string Message { get; set; }

    [JsonProperty("status_code")]
    public string StatusCode { get; set; }
}

更新

所以我最终使用对象作为反序列化的全部捕获。

    [JsonProperty("error")]
    public object Error { get; set; }

    public string ErrorAsString => Error is string ? Error.ToString() : null;

    public ObjectError ErrorAsObject => Error is string ? null : Error != null ? JsonConvert.DeserializeObject<ObjectError>(Error.ToString()) : null;

这并不理想,我知道。

标签: c#json.netdeserializationjson-deserialization

解决方案


您可以使用 NetosoftJson 轻松完成此操作。在这里,您可以检查如何使用它反序列化为对象。

您始终可以解析 JSON 对象并检查它是否具有特定字段。例如:

JObject json = JObject.Parse(jsonString);

if(json.HasKey("message"))
{
    var result = JsonConvert.DeserializeObject<ObjectError>(jsonString);
    // Do some stuff here
}
else
{
    var result = JsonConvert.DeserializeObject<Response>(jsonString);
    // Do some stuff here
}

推荐阅读