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 的反序列化?因为当我调用该操作时,列表项为空。

如果解决方案的一部分是 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;
}

这里有一点额外的开销,因为您要反序列化两次,但在大多数情况下对我来说这是值得的,因为它很容易理解正在发生的事情并根据需要添加新类型。

于 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 回答