2011-04-29 3 views
0

JQuery와 함께 ASP MVC를 사용하고 Json 데이터를 컨트롤러에 게시하고 있습니다.MVC - Http Post JSON - 직렬화 종속성

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

다음을 사용하여 직렬화를 수행합니다. 이것은 잘 작동

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

다음 모델에 직렬화

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

.

내가 해결하려고하는 문제는 데이터 형식이 제어 값에 전달되는 내용에 따라 달라진다는 점입니다.

리플렉션을 사용하여 컨트롤 값에서 컨트롤 인스턴스를 만듭니다. 그런 다음이 컨트롤 인스턴스를 호출하여 동적 유형을 가져 와서 "데이터"를 별도로 직렬화하는 데 사용할 수 있기를 원합니다. 여기

CustomControl.GetDataType()

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

typeof(PersonModel) 그래서 기본적으로 나는 두 개의 서로 다른 부분 덩어리 내 JSON을 구문 분석 할 수 있는지 찾기 위해 노력하고 반환합니다.

아이디어가 있으십니까? 제안? thaBadDawg의 제안으로 당


, 내 제어 구현 풀 이후에 다음 날 내가 먼저 컨트롤을 꺼내 할 수 있도록 개별적으로 JSON 항목을 분석 할 수 있습니다 JSON.Net 경로로가는 종료하고, 필요한 맞춤 데이터 항목을 내가 JSON에 Linq에로를 사용하여 Json.Net 경로를가는 제안 내 머리 위로 떨어져

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

:

여기 JSON Linq에를 사용하는 아주 좋은 예있다. 데이터를 비 직렬화 할 수 없습니까? –

+0

@ gjsduarte - 저는 두 부분으로 json을 비 직렬화하려고합니다. 먼저 컨트롤과 데이터를 차례로 봅니다. 데이터를 직렬화하려는 유형은 사용 된 컨트롤에 따라 달라지기 때문입니다. – cweston

+0

이게 당신이 찾는거야? http://stackoverflow.com/questions/560575/asp-net-mvc-how-to-pass-json-object-from-view-to-controller-as-parameter –

답변

1

: 여기

합니다 (예를 들면, 단순화) 다시 쓴 위의 내 예제는이를 사용하는 것입니다 파서를 만들고 최상위 수준의 deserialization을 건너 뛰고 (그냥 값을 쿼리합니다) 중첩 된 개체를 deserialize 할 형식을 결정하게합니다. DataContractJsonSerializer에 대한 나의 경험은 저에게 당신이 그 경로를가는 간단한 해결책을 찾을 수 없을 것이라고 믿게합니다. 나는 당신의 질문의 시점에 도달하고 있지 않다 http://james.newtonking.com/projects/json/help/LINQtoJSON.html

+0

이것은 유망 해 보입니다. 나는 이것에 대해 살펴보고 고마워 할 것입니다. – cweston

관련 문제