2013-10-03 3 views
0

편집 : 답변을 찾았습니다 (설명에 있음).JSON에서 POST를 ApiController에 보내십시오.

현재 서버의 메모리에있는 객체에 액세스하려면 System.Web.Http.ApiController을 사용하고 있습니다. 이러한 개체는 모든 유형을 가질 수 있습니다. (. 예제 코드 안 전체 소스 코드를)

public class DataController : ApiController 
{ 
    Dictionary<String, Object> _dataDict; 

    public object Get(string dataPath) 
    { 
     Object result = _dataDict[dataPath]; 
     return result; 
    } 
} 

이 웹 API를 통해 JSON 내 모든 오브젝트를받을 잘 작동 :

내가 그들을받을 다음 API를 컨트롤러를 사용합니다. 문제는 POST를 사용하여 새 개체를 보내는 것입니다.

public class DataController : ApiController 
{ 
    Dictionary<String, Object> _dataDict; 

    public object Get(string dataPath) 
    { 
     Object result = _dataDict[dataPath]; 
     return result; 
    } 
    public void Post(string dataPath, Object obj) 
    { 
     _dataDict[dataPath] = obj; 
    } 
} 

개체는 실제 deserialize 된 개체 대신 동적 개체가됩니다. 다음과 같은 구체적인 방법을 구현하십시오.

public object Post(string dataPath, MyClass instance) 
{ 
    _dataDict[dataPath] = instance; 
} 

잘 작동합니다. 슬프게도, 런타임에 사용 된 모든 유형을 모르지만 dataPath를 분석하여 어떤 유형인지 알고 런타임에 Type 인스턴스를 얻을 수 있습니다. 올바른 형식을 사용하여 올바른 인스턴스를 만들기 위해 포맷터 또는 ApiController (실제로 인스턴스를 만드는 사람을 알 수 없음)에게 어떻게 알릴 수 있습니까?

나는 System.Net.Http.Formatting.JsonMediaTypeFormatter을 사용하고 있습니다.

미리 감사드립니다.

devluz

+0

나는 내 자신의 질문에 대답하지만, 해결책을 발견하지 못할 : 그것은 실제로하는 jobject가 아닌 동적 객체입니다. 난처한 대답은 다음과 같습니다. public void Post (string dataPath, JObject obj) { 유형 myClass = figureOutMyTypeByParsingThePath (dataPath); _dataDict [dataPath] = obj.ToObject (myClass); } 그리고 그걸 알아 내는데 몇 시간이 걸렸습니다. – luz

+0

시간을 낭비하게되어 죄송합니다. :) 감사합니다. – luz

답변

1

잘 확인이 실제로하는 jobject가 아닌 동적 객체입니다. 당황 대답은 :

public void Post(string dataPath, JObject obj) 
{ 
    Type myClass = figureOutMyTypeByParsingThePath(dataPath); 
    _dataDict[dataPath] = obj.ToObject(myClass); 
} 
관련 문제