1

im使用MVC 4我的ActionController收到
以下JSON:JSON反序列化在MVC 4控制器多態性陣列

{ 
    "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;} 
} 

所以,現在,我怎麼可以管理MainClass反序列化時的動作控制器RECE我的JSON?因爲當我調用行動的列表項是空的。

如果解決方案的一部分是Json.NET,怎麼可以實現用於MVC 4個控制器?

感謝您的幫助。

回答

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; 
} 

有額外的一點點這裏的開銷,因爲你要反序列化的兩倍,但它是值得的在大多數情況下我,因爲這很容易理解這是怎麼回事,並根據需要增加新的類型。

+0

非常感謝保羅,我不能投你的答案,因爲我的名氣,但我想用模型綁定,因爲我只使用網絡api的CRUD操作。在模型綁定器的實現中,我找不到獲取數組值的方法。例如: values [「MainId」] - >這是好的 values [「Actions」] - >這是空的,而不是它我發現值[「Actions [0] .Attribute1ClassA」] Is there沒有辦法讓類似:值[「行動」]這樣我就可以通過遍歷數組做反序列化? – Luiggi

+0

是的,只要反序列化整個請求主體,然後動態地訪問它以同樣的方式:'result.Actions'。爲了保持簡單,您可以重新操作actions數組的每個實例,然後反序列化爲正確的類型。 – Paul

0

您可以解析JSON成動態對象,而不是使用Json.NET

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;