Jsonresult / запрос, возвращающий json, завернутый в XML

У меня есть метод, который запрашивает внешние веб-сервисы и возвращает здесь json:

    public string GetJsonRequest(string url)
    {
        string response = string.Empty;
        var request = System.Net.WebRequest.Create(url) as HttpWebRequest;
        if (request != null)
        {
            request.Method = WebRequestMethods.Http.Get;
            request.Timeout = 20000;
            request.ContentType = "application/json";


            var httpresponse = (HttpWebResponse)request.GetResponse();

            using (var streamreader = new StreamReader(httpresponse.GetResponseStream()))
                   response = streamreader.ReadToEnd();

            if (httpresponse != null) httpresponse.Close();
        }
        return response;
    }

И метод, который возвращает результат здесь:

    public JsonResult Makes()       
    {
        CarRepository rep = new CarRepository();
        return new JsonResult()
        {
            Data = rep.GetMakes(),
            ContentType = "application/json"
        };
    }

or

    public string Makes()       
    {
        CarRepository rep = new CarRepository();
        return rep.GetMakes();
    }

Это возвращает правильный json, но он завернут в XML

<JsonResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <ContentType>application/json</ContentType>
   <Data xsi:type="xsd:string">
       The JSON data.......
   </Data>
  <JsonRequestBehavior>AllowGet</JsonRequestBehavior>
  <MaxJsonLength xsi:nil="true"/>
  <RecursionLimit xsi:nil="true"/>
</JsonResult>

Я проверил запрос в fiddler, и заголовки Accept содержат только значения xml. Как я могу заставить это просто распечатать json? Я использую веб-API ASP.NET. Я могу удалить XML mediatypeformatter при запуске приложения, но мне может понадобиться использовать его позже, поэтому я не думаю, что это правильный путь.

заранее спасибо


person gdp    schedule 02.04.2012    source источник


Ответы (2)


Вы не должны возвращать JsonResult из действия ApiController. Действия ApiController должны возвращать объекты (или коллекции), а MediaTypeFormatters заботятся о их сериализации в JSON, XML или что-либо еще (в зависимости от запрошенного типа контента). Пожалуйста, взгляните на этот базовый руководство.

ОБНОВЛЕНИЕ

Чтобы убедиться, что клиент запрашивает JSON (не XML), а веб-API попытается использовать правильный MediaTypeFormatter, добавьте это в свой клиент:

request.Accept = "application/json";
person tpeczek    schedule 02.04.2012
comment
Хорошо, я изменил его, чтобы вернуть строку, но она все та же. Json, завернутый в XML. - person gdp; 02.04.2012
comment
Вы говорите, что rep.GetMakes() возвращает строку? Пожалуйста, проверьте мое обновление о вашем запросе клиента также. - person tpeczek; 02.04.2012
comment
да rep.getmakes() возвращает строку. Я не думаю, что смогу вернуть объект, потому что данные сильно меняются в зависимости от того, откуда я их получаю. - person gdp; 02.04.2012
comment
Да, это правильно, я просто был идиотом и загрузил его из браузера, который по умолчанию использует application/xml, когда я вручную создал запрос в скрипаче, он работал. Вторая проблема заключается в том, что строковые кавычки JSON экранируются? Спасибо за вашу помощь до сих пор - person gdp; 02.04.2012
comment
@tpeczek У меня похожая проблема. Не могли бы вы проверить это и дать мне решение stackoverflow.com/questions/13558856/ - person Xavier; 26.11.2012

Вместо возврата строки в вашем WebMethod используйте:

JavaScriptSerializer js = new JavaScriptSerializer();
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT));
person JayC    schedule 16.05.2013