5

私は .NET を使用してJavascriptSerializerJSON をランタイム オブジェクトに逆シリアル化しています。ほとんどの場合、JSON フィールドとオブジェクト フィールドの間のマッピングは自動的に行われています。ただし、次のシナリオに直面しており、対処方法についてアドバイスをいただければ幸いです。

正方形または円である Shape の JSON 表現があるとします。例えば、

{"ShapeType":"Circle","Shape":{"Color":"Blue", "Radius":"5.3"}}

また

{"ShapeType":"Square","Shape":{"Color":"Red", "Side":"2.1"}}

これらの JSON 文字列は、以下に示すクラス階層をモデルにしています。

class ShapePacket
{
    public string ShapeType;  // either "Square" or "Circle"
    public Shape Shape;
}

class Shape   // all Shapes have a Color
{
    public string Color;
}

class Square : Shape
{
    public float Side;
}

class Circle : Shape
{
    public float Radius;
}

JavascriptSerializer.Deserializeこの場合、バリアント型が関係しているため、単に呼び出すだけでは機能しません。JavascriptSerializer私のデータ型の「分岐」にもかかわらず、デシリアライズするように説得する方法はありますか? 私はサードパーティのソリューションにもオープンです。

4

2 に答える 2

2

データ型の分岐には、コードの分岐が必要になる可能性があります。明示的な方法以外にこれを行う方法があるとは思いません。

私はこれを2つのステップで行います:

まず、受信 JSON オブジェクトを型なしハッシュに変換します。JsonConvert.DeserializeObject

次に、「ShapeType」フィールドで手動で分岐して適切なShapeクラス (SquareまたはCircle) を選択し、自分でインスタンスを構築します。

(後世のためにここに明示的な解決策が含まれていますが、私の助けは必要ないと思います;)

于 2011-04-08T17:32:55.967 に答える
1

次のような JavaScriptTypeResolver 実装で JavascriptSerializer を初期化する必要があると思います (SimpleTypeResolver はクラス ライブラリに組み込まれています)。

new JavaScriptSerializer(new SimpleTypeResolver());

自動型解決を有効にするため。結果として、出力 JSON に __type フィールドが追加され、後でタイプを解決するために使用されると思います。

于 2011-04-08T17:36:24.920 に答える