Возврат Json из общего списка в веб-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 (result) Результат, являющийся фактическим списком.

Я хотел бы продолжать использовать 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?

* Обновление *

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

Accept: application/json, text/javascript,/; д = 0,01

"[{\" title\": \" Lacidofil ®\", \" description\": \" Lacidofil® имеет функции Lactobacillus helveticus Institut Rosell и Lactobacillus rhamnosus. Оба эти штамма были широко изучены в клинических испытаниях человека, имеют... \", \" 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\": \" Пробио обороны ™\", \" description\": \" Пробио Defence ™ "является оптимальной комбинацией пробиотических бактерий, которые поддерживают иммунную систему. Этот продукт содержит:\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 ™ - это вегетарианская, dairy- и безглютеновая пробиотика с четырьмя деформациями, суммарная 30 миллиардов CFU † на капсулу. Каждая вегетарианская капсула запечатана в продувке азотом... \", \" url\": \"/products/product-detail.aspx? Pid = 181\"}, {\" title\": \" ProbioMax DF ™\", \" description\": \" ProbioMax DF ™ - это вегетарианская, dairy- и бесклеточная, четырехфазная пробиотическая суммарная 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 ™ - это лактоза - безрецидивная, устойчивая к кислоте, стабильная европейская патентная формула, содержащая ДНК-подтвержденный Saccharomyces boulardii. Эти пробиотические дрожжи поддерживают... \", \" url\": \"/products/product-detail.aspx? Pid = 197\"}]"

Ответ 1

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

Если вы вернете объекты в виде списка, то формат медиафайла по умолчанию будет обрабатывать сериализацию на основе типа содержимого, указанного на клиенте (при условии, что это 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;

    }

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

enter image description here

Дополнительную информацию о сериализации см. Здесь:

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

Ответ 2

Я обычно сериализую 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;