2013-12-16 5 views
13

Я строю свой список, как это:Возврат Json из списка Generic в Web API

public static List<SearchFormula> SearchData(string searchString) 
{ 
    var searchResults = new List<SearchFormula>(); 

    SqlDataReader drResults = FormulaUtility.SearchFormulas(searchString); 

    if ((drResults != null) && (drResults.HasRows)) 
    {     
     while (drResults.Read()) 
     { 
      searchResults.Add(new SearchFormula() 
      { 
       // id use the GetValue function 
       Title = drResults.GetString(1), 
       Description = drResults.GetString(2), 
       Url = drResults.GetString(3) 
       // total use the GetValue Function 
       }); 
      } 
     } 
    return searchResults; 
} 

С помощью этого объекта:

public class SearchFormula 
{ 
    public string Title { get; set; } 

    public string Description { get; set; } 

    public string Url { get; set; } 
} 

Я начал использовать IHttpActionResult, возвращая OK (результаты); функция. Я считаю, что это то, что заставило меня сбить с толку дорогу. Я успешно отправил ArrayList, но это не сериализовало то, как я думал.

Я попытался изменить его на ActionResult и попытался вернуть Json (результат). Результат - фактический список.

Я хотел бы продолжить использование IhttpActionResult и отправить сериализованные данные с помощью метода OK(). Кажется, у меня тоже есть конфликт между встроенным json-сериализатором и селекторами NewtonSoft json.

Что следует использовать. Каков самый простой способ просто сериализации общего списка и передачи результата в метод IHttpActionResult OK()?

Я попытался JavaScriptSerializer, но он возвращает XML не JSon ...

public class SearchController : ApiController 
{ 
    public IHttpActionResult Get(string searchTerm) 
    {    
     var jsonSerialiser = new JavaScriptSerializer(); 
     var jsonResult = jsonSerialiser.Serialize(SearchUtility.SearchData(searchTerm)); 

     if (jsonResult != null) 
     { 
      return Ok(jsonResult); 
     } 
     return NotFound(); 

    } 
} 

Вот в Json.NET Пример:

public class SearchController : ApiController 
{ 
    public IHttpActionResult Get(string searchTerm) 
    { 
     var jsonResult = JsonConvert.SerializeObject(SearchUtility.SearchData(searchTerm)); 

     if (jsonResult != null) 
     { 
      return Ok(jsonResult); 
     } 
     return NotFound();   
    } 
} 

Я попытался MemoryStream ... бла-бла-бла ... нет ничего похожего на чистый, простой подход, и для этого конкретного решения нет предмета.

Позвольте мне начать с этого ...

Как я могу сериализовать общий список для Json?

Как я могу отправить этот результат через IHttpActionResult?

* Update *

Это то, что я получаю для сериализации из Json.NET. НО что-то не так с форматом ... Даже Фиддлер не может определить, что это Json. Мой заголовок выглядит следующим образом (в Fiddler):

Принять: приложение/json, текст/javascript, /; д = 0,01

"[{\" название \ ": \" Lacidofil ® \ "\ "описание \": \" Lacidofil ® особенности Институт Rosell ’ с Lactobacillus Helveticus и лактобактерии рамнозус. Оба эти штамма были широко изучены в клинических испытаниях человека, имеют ... \ ", \" url \ ": \"/products/product-detail.aspx? Pid = 103 \ "}, {\" title \ ": \" MedCaps GI ™ \ ", \" description \ ": \" MedCaps GI ™ обладает ингредиентами, которые предназначены для правильной поддержки целостности и оптимальной функции желудочно-кишечного тракта. Укрепляется питательными веществами, такими как l-глутам ... \ ", \" url \ ": \"/products/product-detail.aspx?pid = 114 \ "}, {\" title \ ": \" OrganiX ™ PhytoFood ™ \ ", \" description \ ": \" OrganiX PhytoFood - это удобная порошковая композиция, обеспечивающая питательные вещества для поддержания здорового образа жизни. Эта всеобъемлющая формула включает в себя   инновационную смесь органических ... \ ", \" url \ ": \"/products/product-detail.aspx? Pid = 271 \ "}, {\" title \ ": \" Пробио Defense ™ \ "описание \": \ "Пробио обороны ™ является оптимальным сочетанием пробиотических бактерий, которые поддерживают иммунную систему. \ R \ nЭтот продукт содержит: \ r \ n \ r \ nLactobacillus helveticus Rosell-52 (3 миллиард) \ r \ nLactobacillu ... \ ", \" url \ ": \"/products/product-detail.aspx? pid = 102 \ "}, {\" title \ ": \" ProbioMax Daily DF ™ \ ", \" description \ ": \" ProbioMax Daily DF ™ - вегетарианская, безмолочная и безглютеновая пробиотика с четырьмя штаммами общей суммой 30 миллиардов КОЕ и кинжала; на капсулу. Каждая вегетарианская капсула запечатана в продувке азотом ... \ ", \" url \ ": \"/products/product-detail.aspx? Pid = 181 \ "}, {\" title \ ": \" ProbioMax DF ™ \ ", \" description \ ": \" ProbioMax DF ™ - вегетарианская, безмолочная и безглютеновая пробиотика с четырьмя штаммами, суммарная 100 миллиардов КОЕ и кинжала; на капсулу. Каждая вегетарианская капсула запечатана в алюминий, продутый азотом ... \ ", \ url \": \ "/ products/product-detail.aspx? Pid = 184 \"}, {\ "title \": \ "ProbioMax Плюс DF ™ \ ", \" description \ ": \" Множество полезных преимуществ, получаемых отдельным человеком: добавление пробиотических штаммов бактерий, непатогенных дрожжей  , Saccharomyces boulardii, иммуноглобулинов, ... \ ", \ "url \": \ "/ products/product-detail.aspx? pid = 185 \"}, {\ "title \": \ "Saccharomycin DF ™ \", \ "description \": \ "Saccharomycin DF ™ is не содержащая лактозы, желудочная кислота – устойчивая, стабильная европейская патентная формула, содержащая ДНК-подтвержденный Saccharomyces boulardii. Это пробиотик поддержка дрожжи ... \ "\ "URL \": \ "/ продукция/продукт-detail.aspx PID = 197 \"}]"

+0

Вы смотрели в Json.NET? –

+0

Это часть проблемы, я столкнулся с конфликтом между по умолчанию и newtonsoft. –

+1

Я думал, что API Web уже использовал JSON.NET по умолчанию. В том, что я написал, я всегда возвращаю свой объект, если я специально не хочу возвращать код ошибки HTTP. Таким образом, если ваш клиент хочет использовать XML вместо JSON, у вас больше нет работы. –

ответ

10

Я беру этот подход, который, кажется, намного проще и не предполагает изменение JSon сериалайзер для данных, которые у вас есть ,

Если вы вернете объекты в качестве списка, то формат медиафайла по умолчанию будет обрабатывать сериализацию на основе типа содержимого, указанного на клиенте (при условии, что это json или xml).

Для демонстрационных целей добавьте ниже методы, возвращающие жестко закодированные объекты.

// GET api/search 
    public List<SearchFormula> Get(string searchTerm) 
    { 
     var searchItems = SearchData(searchTerm); 
     return searchItems; 
    } 

    public static List<SearchFormula> SearchData(string searchString) 
    { 
     var searchResults = new List<SearchFormula>(); 

     searchResults.Add(new SearchFormula { Description = "desc1", Title = "title1", Url = "http://url.com" }); 
     searchResults.Add(new SearchFormula { Description = "desc2", Title = "title2", Url = "http://url.com" }); 

     return searchResults; 

    } 

Затем в стельку указать клиент принимает application/json как показано на рисунке ниже, и содержание возвращается в json.

enter image description here

Для получения дополнительной информации о сериализации смотрите здесь:

http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

+0

Правильный заголовок. Объекты заполнены правильно. Обновление результата в моем вопросе. –

+0

Я подсчитал результат json, который он возвращает из моего демонстрационного приложения в вышеупомянутом скриншоте экрана, желтом поле. Разве это не то, чем вы занимаетесь? – hutchonoid

+0

Если вы измените его, чтобы просто вернуть объекты, поскольку они не сериализуют их, он должен работать нормально. Как и в моем примере выше, единственное отличие состоит в том, что я не читаю их из db. – hutchonoid

1

Я обычно сериализации в JSON, используя этот метод расширения? :

public static class Extensions 
{ 
    public static string SerializeToJson<T>(this T obj, DateTimeSerializationFormat format = DateTimeSerializationFormat.DotNet) where T : class 
    { 
     string result; 
     var serializer = new DataContractJsonSerializer(typeof(T)); 
     using (var stream = new MemoryStream()) 
     { 
      serializer.WriteObject(stream, obj); 
      result = Encoding.UTF8.GetString(stream.ToArray()); 
     } 

     if (formaat != DateTimeSerializationFormat.DotNet) 
     { 
      const string dotNetDateTimePattern = @"""\\/Date\((-?\d+)([\+-]\d{4})?\)\\/"""; 

      if (format ==DateTimeSerializationFormat.Iso8601 || format ==DateTimeSerializationFormat.Ruby)) 
      { 
       var matchEvaluator = new MatchEvaluator(ConvertJsonDateToIso8601DateString); 
       var regex = new Regex(dotNetDateTimePattern); 
       resultaat = regex.Replace(resultaat, matchEvaluator); 
       if (format == DateTimeSerializationFormat.Ruby && resultaat.Length > 10) // Ruby time 
       { 
        result = Regex.Replace(result, @"([\+-]\d{1,2}\:\d{2})", " $0"); // Add an space before the timeZone, for example bv "+01:00" becomes " +01:00" 
       } 
      } 

     } 
     return result; 
    } 

    public enum DateTimeSerializationFormat 
    { 
     /// <summary> 
     /// Example: "\/Date(1198908717056)\/" (aantal miliseconden na 1-1-1970) 
     /// </summary> 
     DotNet, 
     /// <summary> 
     /// Example: "1997-07-16T19:20:30.45+01:00" 
     /// </summary> 
     Iso8601, 
     /// <summary> 
     /// Example: "1997-07-16T19:20:30.45 +01:00" 
     /// </summary> 
     Ruby, 
     ///// <summary> 
     ///// Example: new Date(1198908717056) or other formats like new (date (1997,7,16) 
     ///// </summary> 
     //JavascriptDateObject 
    } 

не забудьте добавить использование и ссылки на:

System.Runtime.Serialization.Json; 
+1

Этого вам не нужно, если вам не нужно настраивать форматирование JSON. Экземпляр MediaTypeFormatter в конвейере Http веб-API обрабатывает сериализацию в JSON/XML и де-сериализацию обратно в типы CLR. – dotnetguy

Смежные вопросы