将JSON对象反序列化为具有“动态”属性的类

时间:2018-11-14 13:43:46

标签: c# json serialization json.net

我正在接收与以下类匹配的JSON消息:

public class Response
{
    public int Code { get; }
    public string Message { get; }
    public string Result { get; }
}

但是Result属性的值取决于我们在Code中得到的内容,并且没有固定的结构。

例如如果Code = 1,则Result将返回X类型的对象的列表;如果Code = 2,则Result将返回Y类型的对象的列表。

当我尝试反序列化收到的消息时,将结果类型设置为string似乎不起作用。

var responseObj = JsonConvert.DeserializeObject<Response>(response);
if (responseObj.Code == 1)
{
    return responseObj.Result;
}

上面的return语句引发以下异常:

  

解析值[。时遇到意外字符。路径“结果”

如何定义我的类,以便它接收Result的整个文本,以后可以决定对其进行反序列化?因为我所有的请求都以上述结构响应,所以我想从同一位置管理所有这些请求。

1 个答案:

答案 0 :(得分:1)

  

如何定义我的类,以便它接收Result的整个文本,以后可以决定对其进行反序列化?

如果要这样做,则将Result属性设置为JToken,而不是string,如下所示。您还需要将setter添加到Response类中显示的所有属性中,以允许反序列化正常工作:您不能反序列化为只读属性。

public class Response
{
    public int Code { get; set; }
    public string Message { get; set; }
    public JToken Result { get; set; }
}

一旦您知道应该将Result转换为哪种类型,就可以使用ToObject()方法来实现。例如:

Response responseObj = JsonConvert.DeserializeObject<Response>(response);

if (responseObj.Code == 1)
{
    var listOfX = responseObj.Result.ToObject<List<X>>();
    ...
}

提琴:https://dotnetfiddle.net/pz5m63