2017-02-28 12 views
1

私はこの作業に長時間を費やしました。他の誰かが私と同じ間違いを犯した場合は、ここに投稿しています。抽象JSONオブジェクトが解析されないのはなぜですか?

だから、状況を再現するために、私は基本的な継承といくつかのクラスだった:今

public abstract class Foo 
{ 
    public string Name { get; set; } 
} 

public class Bar : Foo 
{ 
    public int SomethingSpecial { get; set; } 
} 

public class Baz : Foo 
{ 
    public string SomethingMundane { get; set; } 
} 

を、私はJSON文字列を取り、バックFooの具体的な実装を解析することができるようにしたいです、 jsonがどのタイプを表すかを事前に知らなくても。

{ 
    "$type": "MyNamespace.Bar", 
    "Name": "Resources", 
    "SomethingSpecial": 42 
} 

オブジェクトをデシリアライズするとき、あなたは、タイプ処理オプション、およびカスタムバインダを指定することもできます。JSON.Netは、オブジェクトの種類を調べるために$タイプ変数を使用することによって、これを処理しますJsonSerializerSettingsでは、それはオプションです。

私が遭遇した問題は、Webクライアントからjsonをポストすると、オブジェクトがデシリアライズされず、代わりに例外がスローされるか、ASP.NetのPOSTパラメータの場合は値がちょうどnullとなります。

答えて

2

ここでの問題は、Newtonsoft.Jsonは(少なくとも、私が使用しているバージョン - 9.0.1が)ということである$タイプ要素がオブジェクトの最初要素であることを期待し、ときにそれを無視します他の位置にある。したがって、次のJSON、問題のJSONに技術的に同等ながら、動作しません:それはパフォーマンスへの影響を持っているかもしれないが

{ 
    "Name": "Resources", 
    "$type": "MyNamespace.Bar", 
    "SomethingSpecial": 42 
} 

ありは、このための設定です:

new JsonSerializerSettings 
{ 
    // $type no longer needs to be first 
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead 
} 

JavaScriptのJSON.stringify関数を使用している場合、プロパティは一般にオブジェクトに最初に割り当てられた順番で書き出されるので、まず最初に行うことは$タイプを割り当てることです。

関連する問題