2016-11-24 2 views
0

Я пытаюсь deserealize JSON:использованием DataContractJsonSerializer knowntype

Классы порождается json2sharp

Но он бросает исключение:

Элемент ": Data" содержит данные о типе данных, отображающей на имя "http://schemas.datacontract.org/2004/07/TMSoft.CryptoDoc.Gu45:Gu45". Deserializer - это информация любого типа, сопоставляемая с именем . Используйте 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" 
} 
+1

Я попробовал ваш код с 'Json.net' он работает. 'JsonConvert.DeserializeObject (json);', так почему бы вам не использовать его вместо этого? – esiprogrammer

+0

@esiprogrammer, руководитель команды запрещает вводить новые зависимости в проект. – A191919

+0

Json.NET используется везде. Это даже встроенный сериализатор в проектах ASP.NET Web API. Дополнительная зависимость - это DataContractJsonSerializer, устаревший класс, который не активно обновляется точно, потому что даже Microsoft использует Json.NET –

ответ

1

У меня был подобный опыт в моих предыдущих проектов с DataContractJsonSerializer. кажется, что поле «__type» имеет особое значение для DataContractJsonSerializer. Это одна из главных причин того, что я использую Json.net

это имеет значение, только если это первое свойство в объекте, но если у него есть какие-либо другие позиции он работает и исключения не бросили. вы можете попробовать, но изменив позицию __type ниже свойства ветки в Json.txt. Я не знаю, так ли это, и вы можете найти обходное решение. я не пробовал this решение, но стоит дать ему попробовать:

надеюсь, что это помогает

Смежные вопросы