我将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);
但课程是空的。我做错了什么?
答案 0 :(得分:10)
您正在尝试将相同的JSON反序列化为两个不同的类,就好像反序列化器将神奇地知道要使用哪个JSON部分。你需要一个包装类:
public class Message
{
public ON ON { get; set; }
public OFF OFF { get; set; }
}
然后像这样反序列化:
var message = JsonConvert.DeserializeObject<Message>(responsetext);
现在您可以访问message.ON
和message.OFF
:
答案 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);