【问题标题】:using DataContractJsonSerializer knowntype使用 DataContractJsonSerializer knowntype
【发布时间】: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&lt;RootObject&gt;(json);,那你为什么不用它呢?
  • @esiprogrammer,团队负责人禁止在项目中引入新的依赖项。
  • Json.NET 无处不在。它甚至是 ASP.NET Web API 项目中的内置序列化程序。额外的依赖是`DataContractJsonSerializer`,一个没有被主动更新的遗留类,因为即使微软也使用Json.NET
  • 这里的问题是,为什么要添加对连微软都不使用的遗留类的依赖?
  • 顺便说一句,您的 Json 对日期和时间字符串使用了多种非标准格式,例如 07.03.2014 10:00:00。这不是一个好主意

标签: c# json


【解决方案1】:

我在之前的 DataContractJsonSerializer 项目中也有类似的经历。似乎“__type”字段对于 DataContractJsonSerializer 具有特殊含义。 这是我使用 Json.net

的主要原因之一

仅当它是对象中的第一个属性时才重要,但如果它具有任何其他位置,则它可以工作并且不会引发异常。您可以尝试一下,但要更改 Json.txt 中分支属性下方的 __type 位置。我不知道是不是这种情况,您可以找到解决方法。 我还没有尝试过this 解决方案,但值得一试:

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多