2016-11-24 8 views
0

をknowntype:は、私はJSONをdeserealizeしようとしています

クラスjson2sharp

によって生成された。しかし、それは例外スローされます。

要素 ":データは" マップデータ型からのデータが含まれています 「http://schemas.datacontract.org/2004/07/TMSoft.CryptoDoc.Gu45:Gu45」という名前に変更します。 デシリアライザはどのタイプの情報でもなく、同じ名前の と一致します。 DataContractResolverを使用するか、「Gu45」に一致する型を追加します。 KnockTypeAttribute属性を使用するか、 などの既知の型のリストを、 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

に役立ちます願っています。 'JsonConvert.DeserializeObject (json);'だから、代わりに使ってみませんか? – esiprogrammer

+0

@ esiprogrammer、チームリードはプロジェクトに新しい依存関係を導入することを禁じます。 – A191919

+0

Json.NETはどこでも使用されています。これはASP.NET Web APIプロジェクトのビルトインシリアライザです。余分な依存関係は、DataContractJsonSerializerです。これは、マイクロソフトでもJson.NETを使用しているため、積極的に更新されていないレガシークラスです。 –

答えて

1

私はDataContractJsonSerializerと私の以前のプロジェクトで似たような経験を持っていました。 「__type」フィールドには、DataContractJsonSerializerの特別な意味があるようです。 オブジェクトの最初のプロパティだが、それは他のポジションを持っている場合、それが動作し、例外がスローされていない場合にのみ問題に私はJson.netを使用する主な理由の1

です。それを試してみることができますが、Json.txtのブランチプロパティの下の__タイプの位置を変更してください。それが事実かどうかわかりませんし、回避策を見つけることができます。 私はthis解決策を試していないが、それは価値がそれを試してみることにし:

はそれが私はそれが動作 `Json.net`であなたのコードを試してみました

関連する問題