MVC 4 控制器中多态数组的 JSON 反序列化



我使用 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 控制器?

感谢您的帮助。

您需要一个属性或一组属性,您可以从中确定类要使用此方法的类型。使用 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;
}

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

您可以使用

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;

相关内容

  • 没有找到相关文章

最新更新