2013-12-16 4 views
13

내가 이렇게 내 목록을 구축 :반환 JSON은

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

이 Object 사용 :

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

    public string Description { get; set; } 

    public string Url { get; set; } 
} 

내가 OK (결과를) 반환하는 IHttpActionResult을 사용하기 시작을; 기능. 나는 이것이 혼란스러운 길로 나를 시작한 것이라고 생각한다. 나는 ArrayList를 성공적으로 보냈지 만 이것이 생각했던대로 직렬화하지는 못했습니다.

ActionResult로 변경하고 Json (result) 결과를 실제 목록으로 반환하려고 시도했습니다.

계속 IhttpActionResult를 사용하고 OK() 메서드를 사용하여 직렬화 된 데이터를 보내고 싶습니다. 나 또한 내장 된 json serializer와 NewtonSoft json serializer간에 충돌이있는 것 같다.

무엇을 사용해야합니까? 제네릭 목록을 serialize하고 결과를 IHttpActionResult OK() 메서드에 전달하는 가장 간단한 방법은 무엇입니까? 하지 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 예

내가 JavaScriptSerializer을 시도했지만이 XML을 반환 : 나는 MemoryStream을 시도했다

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

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

을 ... ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ ... 아무것도 깨끗하고 직선적 인 접근 방법처럼 보이지 않으며이 특정 솔루션에 대한 주제가 없습니다.

가 어떻게 JSON에 대한 일반 목록을 직렬화 할 수 ... 날이 시작하자?

어떻게 결과를 IHttpActionResult를 통해 보낼 수 있습니까?

* 업데이트 *

이 내가 Json.Net에서 직렬화 얻고 것입니다. 그러나 포맷에 문제가 있습니다 ... 심지어 Fiddler도 그것이 Json이라고 판단 할 수 없습니다. 내 머리글은 다음과 같습니다 (Fiddler에서) :

수락 : application/json, text/javascript, /; "\"Lacidofil ® \ "\"설명 \ "\"Lacidofil ® 투트 Rosell ’의 락토 바실러스 헬 베티와 락토 rhamnosus 기능 0.01

"는 [{\"표제 \는 = Q. 이 두 균주는 모두 인간의 임상 시험에서 광범위하게 연구되어 왔으며 ... \ ", \"url \ ": \"/ products/product-detail.aspx? pid = 103 \ "}, {\" ": \"MedCaps GI ™ \ ", \"description \ ": \"MedCaps GI ™은 위장관의 보전성과 최적 기능을 영양 적으로 지원하도록 고안된 재료를 특징으로합니다. l-glutam ... \ ", \"url \ ": \"/ products/product-detail.aspx와 같은 영양소가 풍부합니까?OrganiX PhytoFood는 건강한 생활 습관을 키우는 데 유용한 영양소 인  을 제공하는 편리한 분말 형태입니다. 이 포괄적 인 공식은 혁신적인 유기농 블렌드 인  을 통합합니다. \ ", \"url \ ": \"/ products/product-detail.aspx? pid = 271 \ "}, {\"title \ ": \"Probio Probio Defense ™은 면역계를 지원하는 probiotic bacteria의 최적 조합입니다.이 제품에는 다음이 포함되어 있습니다 : \ r \ nLactobacillus helveticus Rosell-52 (3) ProbioMax Daily DF ™ \ ProbioMax Daily DF ™는 ProbioMax Daily DF ™ 제품입니다. ProbioMax Daily DF ™은 채식주의 자, 낙농가 및 글루텐이없는 4 가지 변형 균주로 총 300 억 CFU의 대장균이다. 캡슐 당. 각 채식 캡슐은 질소 제거 된 알루 (alum)로 봉인되어 있습니다 ... \ "url \": \ "/ products/product-detail.aspx? pid = 181 \"}, {\ "title \": \ "ProbioMax ProbioMax DF ™은 채식주의 자, 낙농가 및 글루텐이없는 4 개의 균주가있는 프로 바이오 틱이며 총 1,000 억 CFU입니다. 캡슐 당. 각 채식 캡슐은 질소 제거 된 알루미늄 ... \ ", url \": \ "/ products/product-detail.aspx? pid = 184 \"}, {\ "title \": \ "ProbioMax "DF ™" "\"설명 \ ": \"박테리아의 probiotic 균주, 비병원성 균주   효모, Saccharomyces boulardii, 면역 글로불린을 보완하여 개별적으로 얻은 많은 건강상의 이익 \ Saccharomycin DF ™은 "url \": \ "/ products/product-detail.aspx? pid = 185 \"} {\ "title \": \ "Saccharomycin DF ™ \", \ " 락토오스가없는 위산 – DNA가 검증 된 Saccharomyces boulardii를 함유 한 내구성이 있고 안정된 유럽 특허 출원 제형. 이 프로 바이오 틱 효모는 ... \ ", \"url \ ": \"/ \/products/product-detail.aspx? pid = 197 \ "}]"

+0

당신이 Json.Net에 봤어? –

+0

그게 문제의 일부 야, 기본값과 newtonsoft 사이에 충돌이 생겼어. –

+1

Web API는 이미 JSON.NET을 기본적으로 사용하고 있다고 생각했습니다. 필자가 작성한 내용에서 HTTP 오류 코드를 반환하려는 경우가 아니라면 항상 객체를 반환합니다. 그렇게하면 클라이언트가 JSON 대신 XML을 사용하려고 할 때 더 이상 할 일이 없습니다. –

답변

10

나는 많은 간단 보인다 당신이 가지고있는 데이터에 대한 JSON 시리얼을 변경 포함되지 않습니다이 방법을 .

개체를 목록으로 반환하면 기본 미디어 형식 포맷터는 클라이언트에서 지정한 콘텐츠 형식 (json 또는 xml 임)에 따라 serialization을 처리합니다.

데모 목적으로 하드 코딩 된 객체를 반환하는 다음 메소드를 추가하십시오.

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

    } 

그런 다음 피들러에 아래 그림과 내용이 json로 반환 될 때 클라이언트가 application/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 형식을 사용자 정의해야하는 경우가 아니면이 항목이 필요하지 않습니다. Web API의 Http 파이프 라인에있는 MediaTypeFormatter 인스턴스는 JSON/XML에 대한 직렬화 및 CLR 유형으로의 역 직렬화를 처리합니다. – dotnetguy