MVC - Http Post JSON -序列化依赖

本文关键字:序列化 依赖 JSON Post Http MVC | 更新日期: 2023-09-27 17:53:40

我使用ASP MVC与JQuery和张贴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"];
    }
}

MVC - Http Post JSON -序列化依赖

我建议使用Json。Net路由使用它作为Linq到JSON解析器,并跳过顶层的反序列化(只查询它的值),然后让它决定将嵌套对象反序列化为什么类型。根据我使用DataContractJsonSerializer的经验,我相信您将无法找到一个简单的解决方案。

这里有一个使用Linq toJSON的很好的例子:http://james.newtonking.com/projects/json/help/LINQtoJSON.html