2011-04-29 38 views
0

我使用ASP MVC與JQuery和張貼JSON數據到我的控制器。MVC - Http發佈JSON - 序列化依賴

var jsonPostData = { 
    control: "PersonControl", 
    data: { 
      name: "Craig", 
      age: 25 
    } 
}; 

我正在使用以下來執行我的序列化。

public override void OnActionExecuting(ActionExecutingContext FilterContext) 
{ 
    var contentType = FilterContext.HttpContext.Request.ContentType 
        ?? string.Empty; 
    if (contentType.Contains("application/json")) 
    { 
     object JsonObject = new DataContractJsonSerializer(RootType) 
      .ReadObject(FilterContext.HttpContext.Request.InputStream); 
     FilterContext.ActionParameters[Param] = JsonObject; 
    } 
} 

哪個序列化爲以下模型:

[DataContract] 
public class ControlModel 
{ 
    [DataMember(Name = "control", IsRequired = true)] 
    public string Control { get; set; } 
    [DataMember(Name = "data"] 
    public object Data { get; set; } 
} 

這是工作的罰款。

我想解決的問題是,數據的類型取決於爲控制值傳遞的內容。

我使用反射從控制值創建控件實例。我希望能夠調用這個控件實例來獲得一個動態類型,然後分別用來序列化「數據」。

CustomControl.GetDataType()這裏將返回typeof(PersonModel)

object JsonObject = new DataContractJsonSerializer(CustomControl.GetDataType()) 
    .ReadObject(FilterContext.HttpContext.Request.InputStream); 



[DataContract] //this is what data could be serialized too 
public class PersonModel 
{ 
    [DataMember(Name="name", IsRequired=true)] 
    public string Name { get; set; }  
    [DataMember(Name="age", IsRequired=true)] 
    public string Age { get; set; } 
} 

所以基本上我想找到我是否可以在兩個不同的部分塊解析我JSON。

想法?建議?


按照從thaBadDawg的建議,我結束了與JSON.Net路線,這讓我單獨解析JSON的項目,讓我先拔出控制去,再後來在我的控制實現拉取出所需的自定義數據項。

這裏是上面重寫(和簡化的例子)我的例子來使用:

public override void OnActionExecuting(ActionExecutingContext FilterContext) 
{ 
    if ((FilterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json")) 
    { 
     var bytes = new byte[FilterContext.HttpContext.Request.InputStream.Length]; 

     FilterContext.HttpContext.Request.InputStream.Read(bytes, 0, bytes.Length); 
     FilterContext.HttpContext.Request.InputStream.Position = 0; 

     JObject JsonObject = JObject.Parse(Encoding.UTF8.GetString(bytes)); 

     FilterContext.ActionParameters["Control"] = (string) JsonObject["control"]; 
     FilterContext.ActionParameters["Action"] = (string)JsonObject["action"]; 
    } 
} 
+0

我沒有達到你的問題點。你不能夠反序列化數據嗎? – 2011-04-29 15:47:14

+0

@gjsduarte - 我試圖反序列化兩部分的json,首先是控件,然後是數據。這是因爲我想將數據序列化到的類型取決於使用的控件。 – cweston 2011-04-29 15:50:32

+0

這是你要找的嗎? http://stackoverflow.com/questions/560575/asp-net-mvc-how-to-pass-json-object-from-view-to-controller-as-parameter – 2011-04-29 16:02:19

回答

1

關閉我的頭頂,我建議使用它作爲一個LINQ到JSON去的Json.Net路線解析器並跳過頂層的反序列化(只是查詢它的值),然後讓它決定將該嵌套對象反序列化到哪種類型。我對DataContractJsonSerializer的使用經驗使我相信,你將無法找到一條簡單的解決方案。

有使用LINQ to JSON這裏的一個很好的例子:http://james.newtonking.com/projects/json/help/LINQtoJSON.html

+0

這看起來很有希望,我會檢查一下,看看,謝謝。 – cweston 2011-04-29 17:10:33