我试图反序列化一个JSON字符串,但它不断返回一个具有默认值的对象(false,null等)。
与我合作的JSON来自网络服务并且很长。我已将其粘贴在此处:https://pastebin.com/6LrfSVJE
结构如下:
"Data": [SITE, SITE, SITE, etc.]
"Success": BOOLEAN,
"Message": STRING,
网站的外观如下:
"__type" : STRING
"ID": INTEGER,
"UniqueIdentifier": GUID/STRING,
"Network": INTEGER,
"LandOwner": INTEGER (nullable),
"PermitHolder": INTEGER (nullable),
"Name": STRING,
"Alias": STRING (unique),
"Notes": STRING,
"Latitude": DOUBLE (nullable),
"Longitude": DOUBLE (nullable),
"Elevation": DOUBLE (nullable),
"TimeZoneName": STRING,
"TimeZoneAbbreviation": STRING,
"TimeZoneOffset": INTEGER,
"CreationDate": STRING ISO-8601,
"ModificationDate": STRING ISO-8601,
"GPSLandmark": STRING
我已经在C#中复制这些内容以与Json.NET一起使用:
public class SiteList
{
public bool Success { get; set; }
public string Message { get; set; }
public IList<Site> Data { get; set; }
}
public class Site
{
public string __type { get; set; }
public int ID { get; set; }
public string UniqueIdentifier { get; set; }
public int Network { get; set; }
public int LandOwner { get; set; }
public int PermitHolder { get; set; }
public string Name { get; set; }
public string Alias { get; set; }
public string Notes { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public double Elevation { get; set; }
public string TimeZoneName { get; set; }
public string TimeZoneAbbreviation { get; set; }
public int TimeZoneOffset { get; set; }
public string CreationDate { get; set; }
public string ModificationDate { get; set; }
public string GPSLandmark { get; set; }
}
我将其反序列化为:
string message = /* I make my service call here - same string as the JSON pasted above */
var sitelist = JsonConvert.DeserializeObject<Infrastructure.SiteList>(message);
如果我的数据结构不正确,我希望Json.NET函数返回null。但实际上它确实返回了一个SiteList,只是值为data = null,message = null,success = false。
此代码几天前正在运行,但最近Web服务已更改,网站数据结构现在包含__type字段。从那以后,反序列化就失败了。
我尝试过根本不包括__type字段,将其命名为&#34;输入&#34;,&#34;输入&#34;,&#34; __ type&#34;,&#34; __Type&#34;,但我总是得到相同的结果。我不完全确定Json.NET如何匹配变量名称,但__type字段的引入似乎确实引起了这个问题,并且它没有帮助该名称不遵循先前的约定
有没有人有解决方案或看到我可能忽略的任何错误?
答案 0 :(得分:2)
我从未提及我的SiteList和Site继承自抽象基类 - 它继承的事实从未搞砸过之前的功能。但是我最近将[DataContract]属性添加到这个基类中,以便我可以在我自己的Web服务中使用它的一些继承类,结果证明这是打破反序列化的原因。删除属性或不从DataContract类继承属性可以解决问题。