首页 > 解决方案 > C# Newtonsoft.Json 仅反序列化顶级?

问题描述

我必须使用处理如下错误响应的 API:

{
    "error": {
        "code": 3,
        "message": "error message"
    }
}

成功的反应是这样的:

{
    "data": {
        "key": "value"
    }
}

错误响应将始终包含代码(整数)和消息(字符串),其中成功响应可能有很大不同,从几个键值对到许多对象和数组。

我为每个成功的“数据”部分创建了类,并且可以成功解析它们。现在我用简单的部分来确定我得到的响应实际上是错误响应还是成功响应。

我的想法是创建这些类:

    public class APIResponse
    {
        [JsonProperty("error")]
        public APIResponseError Error { get; set; }

        [JsonProperty("data")]
        public string Data { get; set; }
    }

    public class APIResponseError
    {
        [JsonProperty("code")]
        public int Error { get; set; }

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

并序列化到类APIResponse。这仅适用于错误响应(有点明显),因为数据响应不仅仅是APIResponse.Data实际的字符串。我的想法是不要反序列化数据字段,而是将其作为字符串存储在APIResponse.Data. 然后,当我检查并看到错误为null时,我将APIResponse.Data使用正确的类反序列化该属性。但是我该怎么做呢?

标签: c#jsonjson.netdeserialization

解决方案


您可以将Data属性类型设置为JToken

public class APIResponse
{
    [JsonProperty("error")]
    public APIResponseError Error { get; set; }

    [JsonProperty("data")]
    public JToken Data { get; set; }
}

稍后使用以下命令反序列化ToObject

myCorrectResponse.Data.ToObject<ExpectedDataType>()

但我非常怀疑在出现错误响应的情况下是否会向您发送任何数据,因此我建议您制作APIResponse通用(T可以是对象、数组等):

public class APIResponse<T>
{
    [JsonProperty("error")]
    public APIResponseError Error { get; set; }

    [JsonProperty("data")]
    public T Data { get; set; }
}

其中,如果您的示例 json 将被使用,例如:

class MyClass
{
    [JsonProperty("key")]
    public string Key { get; set; }
}

JsonConvert.DeserializeObject<APIResponse<MyClass>>(json);

推荐阅读