【发布时间】:2016-11-24 19:53:15
【问题描述】:
我正在尝试解除 json:
类由json2sharp生成
但它会抛出异常:
元素“:数据”包含映射到名称的数据类型的数据 “http://schemas.datacontract.org/2004/07/TMSoft.CryptoDoc.Gu45:Gu45”。 解串器是没有任何类型的信息,都与 一样的名字。使用 DataContractResolver 或添加匹配“Gu45”的类型, 已知类型的列表,例如使用 KnownTypeAttribute 属性或 通过将其添加到传递给的已知类型列表中 DataContractSerializer。
如何解决?
namespace json
{
class Program
{
static void Main(string[] args)
{
string json = System.IO.File.ReadAllText(@"D:\Json.txt");
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(RootObject));
var account = serializer.ReadObject(new MemoryStream(Encoding.UTF8.GetBytes(json)));
}
}
public class Branch
{
public string Code { get; set; }
public string Name { get; set; }
}
public class Direction
{
public object Code { get; set; }
public string Name { get; set; }
}
public class Org
{
public string Code { get; set; }
public string Name { get; set; }
}
public class Wagon
{
public string Comment { get; set; }
public object NoteTimeString { get; set; }
public string Number { get; set; }
public string OwnerCode { get; set; }
public string StateString { get; set; }
}
public class Data
{
public string __type { get; set; }
public Branch Branch { get; set; }
public string DeliveryTimeString { get; set; }
public Direction Direction { get; set; }
public string EsrCode { get; set; }
public int GU45Type { get; set; }
public object ManeuverTime { get; set; }
public string Number { get; set; }
public Org Org { get; set; }
public object ParkName { get; set; }
public object ParkNum { get; set; }
public string RailwayName { get; set; }
public string RegistrationDateTimeString { get; set; }
public object Span { get; set; }
public string StationName { get; set; }
public string TakingTimeString { get; set; }
public object TrackNum { get; set; }
public object TrackNumAddition { get; set; }
public object WagonNote { get; set; }
public List<Wagon> Wagons { get; set; }
}
public class Body
{
public Data Data { get; set; }
public List<int> Signature { get; set; }
}
public class RootObject
{
public Body Body { get; set; }
public int Revision { get; set; }
public int State { get; set; }
public string StateDate { get; set; }
public string WosId { get; set; }
}
}
Json.txt:
{
"Body": {
"Data": {
"__type": "Gu45:#TMSoft.CryptoDoc.Gu45",
"Branch": {
"Code": "9898",
"Name": "Place"
},
"DeliveryTimeString": "07.03.2014 10:00:00",
"Direction": {
"Code": null,
"Name": "Test"
},
"EsrCode": "320007",
"GU45Type": 2,
"ManeuverTime": null,
"Number": "1",
"Org": {
"Code": "1860",
"Name": "Test"
},
"ParkName": null,
"ParkNum": null,
"RailwayName": "Test",
"RegistrationDateTimeString": "07.03.2014",
"Span": null,
"StationName": "Test",
"TakingTimeString": "07.03.2014 12:00:00",
"TrackNum": null,
"TrackNumAddition": null,
"WagonNote": null,
"Wagons": [
{
"Comment": "РЕМТ",
"NoteTimeString": null,
"Number": "44916989",
"OwnerCode": "22",
"StateString": "0"
}
]
},
"Signature": [
48,
106
]
},
"Revision": 1966,
"State": 2,
"StateDate": "2014-03-07T12:48:03Z",
"WosId": "15805729"
}
【问题讨论】:
-
我用
Json.net试过你的代码,它可以工作。JsonConvert.DeserializeObject<RootObject>(json);,那你为什么不用它呢? -
@esiprogrammer,团队负责人禁止在项目中引入新的依赖项。
-
Json.NET 无处不在。它甚至是 ASP.NET Web API 项目中的内置序列化程序。额外的依赖是`DataContractJsonSerializer`,一个没有被主动更新的遗留类,因为即使微软也使用Json.NET
-
这里的问题是,为什么要添加对连微软都不使用的遗留类的依赖?
-
顺便说一句,您的 Json 对日期和时间字符串使用了多种非标准格式,例如
07.03.2014 10:00:00。这不是一个好主意