2017-04-08 16 views
1
public class A : JObject 
{} 

と私はfolowingているデシリアライズコードJson.netデシリアライズJOBJECT派生型に

using (StreamReader responseStreamReader = new StreamReader(stream)) 
{ 
    using (JsonReader reader = new JsonTextReader(responseStreamReader)) 
    { 
     JsonSerializer serializer = new JsonSerializer(); 
     return serializer.Deserialize<A>(reader); 
    } 
} 

しかし、それは、デシリアライザはちょうど新しいAを作成する必要があり、実際には無効なキャスト例外

をスローします()新しいJObject()の代わりに、まったく同じことをすると、それだけで十分でしょう。

具体的なJObject型にどのように逆シリアル化できますか?

+0

あなたが達成しようとしていますか?なぜあなたは 'JObject'を継承していますか?そして、なぜ 'JsonReader'が' A'型にキャスト可能であると期待していますか? – CodingYoshi

+0

JObjectやJTokenを操作するコードがたくさんあるので、それを継承するとこのコードが直接有効になり、うまくいくでしょう。 いくつかの機能を追加したいと思います。私は拡張メソッドと合成を使うことができますが、継承するとすぐに私にすべてのものが与えられます。 –

+0

JsonReaderはJObjectに直列化解除するので、JObjectであるAに逆シリアル化するのは問題ではありません –

答えて

0

Json.Netの内部がJTokensを特別に扱うため、Aクラスに直接デシリアライズすることはできません。しかし、コードを少し変更するだけで、簡単に問題を回避することができます。

  1. JObjectを受け入れ、基底クラスのコンストラクタに同じを渡すあなたのAクラスにコンストラクタを追加します。お使いのデシリアライゼーションの方法で

    public class A : JObject 
    { 
        public A(JObject jo) : base(jo) 
        { 
        } 
    
        public A() : base() 
        { 
        } 
    } 
    
  2. 、jオブジェクトにデシリアライズ、そのからあなたAクラスを構築します。

    using (StreamReader responseStreamReader = new StreamReader(stream)) 
    { 
        using (JsonReader reader = new JsonTextReader(responseStreamReader)) 
        { 
         JsonSerializer serializer = new JsonSerializer(); 
         return new A(serializer.Deserialize<JObject>(reader)); 
        } 
    } 
    

フィドル:https://dotnetfiddle.net/S8d3S6

+0

Thx私はそれが最も簡単で最高の解決策だと思います。しかし、余分なコピーは私を悩ます。 JObjectからのロード時にhttps://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/Linq/JObject.csの1行を変更するo = new JObject(); T 0 =新しいT();それを行うだろうが、私はこの変更を変更し維持する気がしない:)。 代わりに古典的な合成アーチを使うと思います –

関連する問題