MVC - Http Post JSON - Сериализация зависимости - PullRequest
0 голосов
/ 29 апреля 2011

Я использую 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 в двух разных частичных фрагментах.

Идеи? Предложения? * * 1023


В соответствии с предложением от 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"];
    }
}

1 Ответ

1 голос
/ 29 апреля 2011

Вдобавок ко всему, я бы предложил пойти по маршруту Json.Net, используя его как синтаксический анализатор Linq to JSON, и пропустить десериализацию верхнего уровня (просто запросить его значение), а затем попросить решить, какой типдесериализовать вложенный объект в.Мой опыт работы с DataContractJsonSerializer заставляет меня поверить, что вы не сможете найти простое решение по этому пути.

Вот довольно хороший пример использования Linq для JSON: http://james.newtonking.com/projects/json/help/LINQtoJSON.html

...