我使用 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;