2016-08-31 19 views
1

JSON 응답을 보내는 서비스가 있습니다. 다음과 같이 컨트롤러 방법은 같습니다JSON 응답을 구문 분석 할 수 없습니다.

string varStr = "{proper JSON here}"; 

public string GetListofResourcesInSubscription(string subscriptionId) 
{ 
    // Uncomment any option below to test. The error persists either way. 
    //return varStr; --- Option 1 
    return JsonConvert.SerializeObject(JObject.Parse(varStr)); // Option 2 
} 

응답을 얻는 방법은 다음과 같다 : 위의 컨트롤러 메소드에서 선택한 return 문의

response = outgoingRequest.GetResponse() as HttpWebResponse; 

if (response.StatusCode == HttpStatusCode.OK) 
{ 
    responseStream = response.GetResponseStream(); 

    using (var reader = new StreamReader(responseStream)) 
    { 
     string strResp = reader.ReadToEnd(); 
     JObject joResponse = JObject.Parse(strResp); // throws error 
     JArray objArray = (JArray)joResponse["value"]; 
     // other processing 
    } 
} 

에 관계없이, 응답 파서가 항상 던지고있다 응답을 구문 분석하는 동안 오류가 발생합니다.

파싱 라인을 다음과 같이 변경하면 문제가 해결되지만 그 이유는 분명하지 않습니다.

JObject joResponse = JObject.Parse(JsonConvert.DeserializeObject<string>(strResp)); 

또한 ASP.NET 웹 api2 컨트롤러에서 JSON 응답을 보내는 올바른 방법을 알고 싶습니다. 모델을 생성하는 대신 직접 반환하려는 JSON 문자열이 있기 때문에 모델을 사용하여 응답을 생성하고 싶지 않습니다.

업데이트 1 :

"Error reading JObject from JsonReader. Current JsonReader item is not an object: String. Path '', line 1, position 6546."} System.Exception {Newtonsoft.Json.JsonReaderException} 
+3

무엇이 오류입니까? – Tim

+0

줄 1, 위치 6546이 단서가 될 수 있습니다. 예외를 발생시키는 json을 제공하는 것은 어떻습니까? – Jocke

답변

1

다시 문자열로 복잡한 JSON 객체를 직렬화 할 수 없습니다 오류는 다음과 같다. JObject를 사용하거나 당신은 성공이 더있을 수 있습니다

JObject joResponse = JObject.Parse(JsonConvert.DeserializeObject<string>(strResp)) 

, 또는 대안이 사전에 직렬화하는 것입니다, 또는 알려진 유형에 : 귀하의 예제는 JSON을 가정하고 있기 때문에하는 문자열로 평가 작동하지 않습니다 .

var dictionary = JsonConvert.DeserializeObject<<Dictionary<string,object>>(strResp); 
+1

사실, 내 예가 효과적이므로 그 이유를 자세히 알고 싶습니다. 귀하의 성명을 감안할 때, 나는 반환 유형이 컨트롤러의 문자열이기 때문에 deserialize가 잘 작동한다고 생각합니다. – dknight

0

여기서 문제는 컨트롤러 기능의 반환 유형입니다. 문자열을 반환 할 때 올바른 결과를 얻으려면 문자열에 대한 serialization이 필요합니다. JSON을 반환하는 올바른 방법은 을 here과 같이 반환하는 것입니다. 따라서 컨트롤러를 다음과 같이 변경해야합니다.

public JToken GetListofResourcesInSubscription(string subscriptionId) 
    { 
     return JObject.Parse(varStr); 
    } 
관련 문제