1

異なるタイプのオブジェクトのコレクションを返すことになっている WebApi コントローラーをセットアップしました。私のダミーコードを簡単に見てください:

interface IDish
{
    int ID { get; set; }
    string Name { get; set; }
}

class Steak : IDish
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string CookingStyle { get; set; }
    public int Weight { get; set; }
}

class Soup : IDish
{
    public int ID { get; set; }
    public string Name { get; set; }
}

class Dessert : IDish
{
    public int ID { get; set; }
    public string Name { get; set; }
    public bool ContainsSugar { get; set; }
}

public class DishController : ApiController
{
    public IEnumerable<IDish> Get()
    {
        var dishes = busisnessLogic.GetDishes();
        return dishes;
    }
}

ご覧のとおり、コントローラーでは、ビジネス ロジックから IDish のコレクションを取得しています。具体的なクラスにはあまり注意を払わないでください。これらは、ここでの説明を簡単にするための単なるサンプルです。実際のビジネスの背景はまったく異なります。

それで、私の問題は何ですか?API コントローラーが IDishes (私の場合は Json) を返すと、IDish インターフェイスのパブリック プロパティのみが Json 出力に書き込まれます。

代わりに、具象クラスのすべてのパブリック プロパティを Json 出力に書き込みたいと考えています。たとえば、IDish が「ステーキ」の場合、ID、Name、CookingStyle、Weight を書き出す必要があります。したがって、「スープ」の場合は ID と名前、「デザート」の場合は ID、名前、ContainsSugar のみです。

これを達成する簡単な方法はありますか?時々、森の前の木を見ない傾向があります...;-)

みんなありがとう!

4

1 に答える 1

1

私はほとんど同じ機能を必要としていましたが、2つの方法があると思います:

  1. JSON.NET TypeNameHandling を使用します。

    var jsonFormatter = config.Formatters.JsonFormatter;
    var jsonSerializerSettings = new JsonSerializerSettings();
    jsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.All;

説明: https://github.com/ayoung/Newtonsoft.Json/blob/master/Newtonsoft.Json/TypeNameHandling.cs

  1. JSON 出力で .NET 型を公開したくない場合は、別のオプションがあります。

基本的に、あなたがする必要があるのは: - JsonCreationConverter から派生したクラスを作成し、Create メソッドをオーバーライドして、作成するオブジェクトのタイプを手動で選択します - 設定を更新します:

var jsonSerializerSettings = new JsonSerializerSettings();
jsonSerializerSettings.Converters.Add(new YourCustomJsonConverter());
jsonFormatter.SerializerSettings = jsonSerializerSettings;

この記事をチェックしてください。段階的に説明されています: http://dotnetbyexample.blogspot.co.uk/2012/02/json-deserialization-with-jsonnet-class.html

于 2013-01-17T13:27:22.573 に答える