【问题标题】:Json.NET Deserialize Returning Object with Default ValuesJson.NET 使用默认值反序列化返回对象
【发布时间】:2017-12-08 05:45:16
【问题描述】:

我正在尝试反序列化一个 JSON 字符串,但它一直返回一个具有默认值(false、null 等)的对象。

我正在使用的 JSON 来自 Web 服务,并且很长。我已经把它贴在这里了: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 字段,将其命名为“type”、“Type”、“__type”、“__Type”,但我总是得到相同的结果。我不确定 Json.NET 如何匹配变量名,但 __type 字段的引入似乎确实导致了问题,并且名称不遵循以前的约定也无济于事。

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

【问题讨论】:

  • 我可以使用 Json.NET 的 Linq 功能解析消息。例如,以下内容可以正常工作:JObject sitelist = JObject.Parse(message); JToken data = sitelist["Data"]; 我可以使用data[index]["Alias"];data[index]["ID"]; 等从站点中提取特定数据。所以我假设字符串没有任何格式错误.
  • 你能分享消息变量的值吗?以便我们检查
  • 消息值是一个空字符串,服务调用成功时它永远不会有任何内容。
  • 我认为您的课程没有任何问题。我可以使用您发布的 JSON 很好地反序列化它们。见fiddle
  • 这真的很奇怪。好吧,至少我现在知道我的课程不正确。我将尝试更新我的 Newtonsoft 软件包,除此之外我有点不知所措。

标签: c# json serialization json.net deserialization


【解决方案1】:

修复:

我从来没有提到我的 SiteList 和 Site 继承自一个抽象基类——事实上,它是被继承的,以前从来没有搞砸过功能。然而,我最近向这个基类添加了 [DataContract] 属性,这样我就可以在我自己的 Web 服务中使用它的一些继承类,结果证明这就是破坏反序列化的原因。删除属性或不从 DataContract 类继承可解决此问题。

【讨论】:

  • [DataContract]应用于基类影响Json.NET如何序列化派生类的原因解释here
猜你喜欢
  • 1970-01-01
  • 2022-01-14
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
相关资源
最近更新 更多