【问题标题】:MVC - Http Post JSON - Serialization DependencyMVC - Http Post JSON - 序列化依赖
【发布时间】:2011-04-29 15:41:22
【问题描述】:

我正在使用带有 JQuery 的 ASP MVC 并将 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"];
    }
}

【问题讨论】:

  • 我没有达到你的问题的重点。你不能反序列化数据吗?
  • @gjsduarte - 我试图将 json 反序列化为两部分,首先是控件,然后是数据。这是因为我希望将数据序列化为的类型取决于所使用的控件。
  • 这是您要找的吗? stackoverflow.com/questions/560575/…
  • @gjsduarte - 谢谢,但我已经在使用其中的许多建议

标签: c# json serialization reflection datacontractserializer


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多