反序列化的类是空白的 - JSON C#

时间:2017-03-16 13:48:13

标签: c# json serialization deserialization

我将JSON API响应反序列化到一个类中 - 但是在代码运行后该类为空,即根本没有反序列化。

以下是JSON的示例,名为responsetext:

{"ON":{"Date":"3/16/2017 10:12:51 AM","PARAM1":"84","PARAM2":"31597.535"},"OFF":{"Date":"3/16/2017 9:05:53 AM","PARAM3":"0","PARAM4":"0"}}

我有两个班级:

public class ON
{
public Date {get; set;}
public string PARAM1 {get; set;}
public string PARAM2 {get; set;}
}
public class OFF
{
public Date {get; set;}
public string PARAM3 {get; set;}
public string PARAM4 {get; set;}
}

我在这里反序:

ON class1 = JsonConvert.DeserializeObject<ON>(responsetext);
OFF class2 = JsonConvert.DeserializeObject<OFF>(responsetext);

但课程是空的。我做错了什么?

3 个答案:

答案 0 :(得分:10)

您正在尝试将相同的JSON反序列化为两个不同的类,就好像反序列化器将神奇地知道要使用哪个JSON部分。你需要一个包装类:

public class Message
{
    public ON ON { get; set; }

    public OFF OFF { get; set; }
}

然后像这样反序列化:

var message = JsonConvert.DeserializeObject<Message>(responsetext);

现在您可以访问message.ONmessage.OFF

screenshot of running example

答案 1 :(得分:1)

响应中的内容不是On或Off的单个实例,而是包含其中一个的对象。当您告诉JsonConvert将此包装器反序列化为一个或另一个类时,它会实例化该类的副本,然后查看要设置的属性的JSON字符串,但是找不到任何内容,因为包含的对象既不是On也不是一个Off,也没有任何领域。所以,它只是让你回到空对象。

您需要包含ON实例和OFF实例的第三个类,并反序列化为该类型;然后你就会得到你想要的结果。或者,您可以自己做一些解析,将每个对象的JSON提取到单独的字符串中,然后对它们进行反序列化(但这首先就是打败了使用Newtonsoft.JSON的目的)。

答案 2 :(得分:0)

您尝试反序列化的Json对象中的ON和OFF是对象的属性。

创建一个与json对象匹配的ONOFF类

public class ONOFF
{
    public ON ON { get; set; }
    public OFF OFF { get; set; }
}

然后将响应反序列化为

ONOFF class3 = JsonConvert.DeserializeObject<ONOFF>(responsetext);