Json.NET反序列化具有默认值的返回对象

时间:2017-12-08 05:45:17

标签: c# json serialization json.net deserialization

我试图反序列化一个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字段的引入似乎确实引起了这个问题,并且它没有帮助该名称不遵循先前的约定

有没有人有解决方案或看到我可能忽略的任何错误?

1 个答案:

答案 0 :(得分:2)

FIX:

我从未提及我的SiteList和Site继承自抽象基类 - 它继承的事实从未搞砸过之前的功能。但是我最近将[DataContract]属性添加到这个基类中,以便我可以在我自己的Web服务中使用它的一些继承类,结果证明这是打破反序列化的原因。删除属性或不从DataContract类继承属性可以解决问题。