1

MVC 4 を使用している場合、ActionController は次の Json を受け取ります。

{
    "MainId": 1,
    "Actions": [
        {
            "Attribute1ClassA": 1,
            "Attribute2ClassA": 2
        },
        {
            "Attribute1ClassB": 3,
            "Attribute2ClassB": 4
        },
        {
            "Attribute1ClassC": 5
        }
    ]
}

そしてコントローラー:

[HttpPost]
public ActionResult Commit(ActionsSummaryViewModel summary)
{
//DO stuff
}

クラスの宣言:

public ActionsSummaryViewModel
{
    public int MainId {get;set;}
    public IList<MainClass> {get;set;}
}

public class MainClass
{
}

public class ClassA : MainClass
{
   public int Attribute1ClassA {get;set;}
   public string Attribute2ClassA {get;set;}
}

public class ClassB : MainClass
{
   public int Attribute1ClassB {get;set;}
   public string Attribute2ClassB {get;set;}
}

public class ClassC : MainClass
{
   public int Attribute1ClassC {get;set;}
}

では、アクション コントローラーが JSON を受け取ったときに MainClass の逆シリアル化を管理するにはどうすればよいでしょうか。アクションを呼び出すと、リスト項目が null になるためです。

ソリューションの一部が Json.NET の場合、MVC 4 コントローラーを実装するにはどうすればよいですか?

ご協力いただきありがとうございます。

4

2 に答える 2

2

クラスがこのメソッドを使用するタイプを決定できるプロパティまたはプロパティのセットが必要です。JSON.NET を使用して、受信した JSON を動的オブジェクトとして逆シリアル化し、共通プロパティをチェックして型を特定し、モデル型を使用してこの型の値を再度逆シリアル化します。

// I'm assuming here you've already got your raw JSON stored in 'value'
// In my implementation I'm using the Web API so I use a media formatter,
// but the same principle could be applied to a model binder or however 
// else you want to read the value.

dynamic result = JsonConvert.DeserializeObject(value);
switch ((string)result.type)
{
case "typeone":
return JsonConvert.DeserializeObject<ModelOne>(value);
// ...
default: return null;
}

ここでは 2 回逆シリアル化するため、余分なオーバーヘッドが少し発生しますが、何が起こっているのかを理解し、必要に応じて新しい型を追加するのは簡単なので、ほとんどの場合、それは価値があります。

于 2012-12-14T20:36:22.613 に答える
0

Json.NETを使用する代わりに、JSON を動的オブジェクトに解析できます。

using Newtonsoft.Json.Linq:

dynamic data = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = data.Name;
string address = data.Address.City;
于 2013-07-24T19:01:21.930 に答える