2016-08-31 3 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 
} 

метод, который получает ответ, как следующее:

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

Кроме того, я хочу знать, что это правильный способ отправки ответа JSON из контроллера ASP.NET веб API2. Я не хочу использовать модели для создания ответа, потому что у меня есть строки JSON, которые я хочу вернуть напрямую, вместо того, чтобы создавать из них модели.

Update 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 обратно в строку. Ваш пример не будет работать, потому что вы предполагая JSON вычисляется в строке:

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

Вы могли бы иметь больший успех, либо с помощью JObject, или альтернатива десериализации в словарь, или в известном типе ,

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

Собственно, мой пример действительно работает, и именно поэтому я хочу понять детали. Учитывая ваше утверждение, я склонен думать, что, поскольку мой тип возврата является строкой в ​​контроллере, десериализация работает нормально. – dknight

0

Проблема заключается в обратном типе функции контроллера. Поскольку он возвращал строку, для получения правильного результата потребовалась сериализация в строку. Правильный способ возврата JSON - вернуть JToken, как описано here. Поэтому необходимо изменить контроллер на следующее:

public JToken GetListofResourcesInSubscription(string subscriptionId) 
    { 
     return JObject.Parse(varStr); 
    } 
Смежные вопросы