2014-10-20 5 views
11

से जेएसओएन वापस आ गया है मैं एक एएसपी.Net वेब एपीआई 2 नियंत्रक से ऊंट केज्ड JSON वापस करने की कोशिश कर रहा हूं। मैंने केवल एएसपी.NET एमवीसी और वेब एपीआई बिट्स के साथ एक नया वेब एप्लिकेशन बनाया है। मैं तो जैसे ValuesController का अपहरण कर लिया:रिटर्न ऊंट वेब एपीआई

public class ValuesController : ApiController 
{ 
    public class Thing 
    { 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string ISBN { get; set; } 
     public DateTime ReleaseDate { get; set; } 

     public string[] Tags { get; set; } 
    } 

    // GET api/values 
    public IHttpActionResult Get() 
    { 
     var thing = new Thing 
     { 
      Id = 123, 
      FirstName = "Brian", 
      ISBN = "ABC213", 
      ReleaseDate = DateTime.Now, 
      Tags = new string[] { "A", "B", "C", "D"} 
     }; 

     return Json(thing); 
    } 
} 

IE में इस चल रहा है, मैं निम्नलिखित परिणाम प्राप्त:

{"Id":123,"FirstName":"Brian","ISBN":"ABC213","ReleaseDate":"2014-10-20T16:26:33.6810554-04:00","Tags":["A","B","C","D"]} 

K. Scott Allen's post विषय पर बाद, मैं WebApiConfig में रजिस्टर विधि के लिए निम्न गयी। सीएस फ़ाइल:

public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     var formatters = GlobalConfiguration.Configuration.Formatters; 
     var jsonFormatter = formatters.JsonFormatter; 
     var settings = jsonFormatter.SerializerSettings; 
     settings.Formatting = Formatting.Indented; 
     settings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

हालांकि, मैं अभी भी अपने परिणामों में एक ही है, capitilization मिलता है। क्या मुझे कुछ याद आ रही है? मैंने कुछ अन्य दृष्टिकोणों की कोशिश की है लेकिन अभी तक कुछ भी काम नहीं करता है।

+0

क्या यह एक स्पष्ट उत्तर है कि लोग सोचते हैं कि मुझे इसे स्वयं समझना चाहिए? मुझे अभी तक एक नींबू नहीं मिला है। मैंने एक नई परियोजना शुरू की और अभी भी यह काम करने में सक्षम नहीं था। – beaudetious

+0

मुझे अभी भी लगता है कि किसी अन्य पोस्ट का उत्तर सबसे सभ्य है: http://stackoverflow.com/a/22130487/1915401 – Xinan

उत्तर

9

लग रहा है मुख्य मुद्दा तरह है कि मैं JsonResult शॉर्टकट का उपयोग किया गया था Json() कार्रवाई परिणाम विधि थी:

public IHttpActionResult Get([FromUri] string domain, [FromUri] string username) 
{ 
    var authInfo = BLL.GetAuthenticationInfo(domain, username); 
    return Json(authInfo); 
} 

यह जाहिरा तौर पर परिणाम स्वरूपण का पूरा नियंत्रण था। अगर मैं लौटने के लिए स्विच HttpResponseMessage तो यह अपेक्षा के अनुरूप काम करता है:

public HttpResponseMessage Get([FromUri] string domain, [FromUri] string username) 
{ 
    var authInfo = BLL.GetAuthenticationInfo(domain, username); 
    return Request.CreateResponse(HttpStatusCode.OK, authInfo); 
} 

मैं WebApiConfig फ़ाइल में कोड के ब्लॉक का उपयोग कर खत्म किया Omar.Alani सुझाव (बहुत lengthier कोड मैं अपने ओपी में था के खिलाफ) । लेकिन वास्तविक अपराधी जेसनआरसल्ट एक्शन विधि थी। मुझे आशा है कि यह किसी और की मदद करेगा।

+5

मुझे पता है कि यह एक देर से टिप्पणी है, लेकिन मुझे पता चला कि 'ओके (authInfo)' का उपयोग करके 'जेसन (authInfo)' का उपयोग करते हुए फॉर्मेटर लागू होता है। 'ओके' विधि 'स्वीकार करें' शीर्षलेख के आधार पर प्रासंगिक फ़ॉर्मेटर लागू करेगी। फिर भी आप 'IHttpActionResult' वापस कर सकते हैं। –

15

अपने WebApiConfig.cs में उन दो पंक्तियों

// Serialize with camelCase formatter for JSON. 
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First(); 
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

सुनिश्चित करें कि आप Newtonsoft पुस्तकालय स्थापित है कि जोड़ना सुनिश्चित करें।

उम्मीद है कि मदद करता है।

+0

नहीं, पहले से ही कोशिश की गई है और न्यूटॉन्सॉफ्ट पहले से स्थापित है। :( – beaudetious

+0

मेरे पास एक समान समस्या थी, आपको फॉर्मूटर को ओविन के लिए httpconfig बनाने की आवश्यकता नहीं है ग्लोबल कॉन्फ़िगरेशन –

+0

@LukeDeFeo क्या आप ओविन के एचटी httpconfig से फ़ॉर्मेटर प्राप्त करने के बारे में कुछ कोड दिखा सकते हैं? – Dmitry

1

मैं ओविन और डीआई (मेरे मामले में ऑटोफैक) का उपयोग कर रहा था ताकि कामों में एक और रिंच फेंकता हो। मेरे Startup.cs शामिल हैं:

var apiconfig = new HttpConfiguration 
{ 
    DependencyResolver = new AutofacWebApiDependencyResolver(container) 
}; 
WebApiConfig.Register(apiconfig); 

तब मेरे WebApiConfig.cs में मेरे पास है:

using System.Net.Http.Formatting; 
using System.Net.Http.Headers; 
using System.Web.Http; 
using Microsoft.Owin.Security.OAuth; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 

public static void Register(HttpConfiguration config) 
    { 
     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     // Setup json.Net for pretty output, easy human reading AND this formatter 
     // does that ONLY for browsers - best of both worlds: useful AND efficient/performant! 
     config.Formatters.Clear(); 
     config.Formatters.Add(new BrowserJsonFormatter()); 
    } 

    public class BrowserJsonFormatter : JsonMediaTypeFormatter 
    { 
     // Since most browser defaults do not include an "accept type" specifying json, this provides a work around 
     // Default to json over XML - any app that wants XML can ask specifically for it ;) 
     public BrowserJsonFormatter() 
     { 
      SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
      SerializerSettings.Formatting = Formatting.Indented; 
      SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      // Convert all dates to UTC 
      SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc; 
     } 

     // Change the return type to json, as most browsers will format correctly with type as text/html 
     public override void SetDefaultContentHeaders(Type type, HttpContentHeaders headers, MediaTypeHeaderValue mediaType) 
     { 
      base.SetDefaultContentHeaders(type, headers, mediaType); 
      headers.ContentType = new MediaTypeHeaderValue("application/json"); 
     } 
    } 
4

आप अपने कार्रवाई के तरीकों में OK() बजाय Json() उपयोग करने के लिए की जरूरत है।

// GET api/values 
public IHttpActionResult Get() 
{ 
    var thing = new Thing 
    { 
     Id = 123, 
     FirstName = "Brian", 
     ISBN = "ABC213", 
     ReleaseDate = DateTime.Now, 
     Tags = new string[] { "A", "B", "C", "D"} 
    }; 

    // Use 'Ok()' instead of 'Json()' 
    return Ok(thing); 
} 
1

WebApiConfig के रजिस्टर विधि में, इस

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = नए CamelCasePropertyNamesContractResolver जोड़ने(); WebApiConfig की

पूर्ण कोड:

public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API configuration and services 

      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 

     } 
    } 


सुनिश्चित करें कि आप Json.Net/Newtonsoft का नवीनतम संस्करण स्थापित किया है।Json स्थापित करने और अपने एपीआई कार्रवाई विधि निम्नलिखित तरीके से डेटा रिटर्न:

[HttpGet] 
    public HttpResponseMessage List() 
    { 
     try 
     { 
      var result = /*write code to fetch your result*/; 
      return Request.CreateResponse(HttpStatusCode.OK, result); 
     } 
     catch (Exception ex) 
     { 
      return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message); 
     } 
    } 
0

भी इस कोशिश करो।

[AllowAnonymous] 
[HttpGet()] 
public HttpResponseMessage GetAllItems(int moduleId) 
{ 
      HttpConfiguration config = new HttpConfiguration(); 
      config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false; 

      try 
      { 
       List<ItemInfo> itemList = GetItemsFromDatabase(moduleId); 
       return Request.CreateResponse(HttpStatusCode.OK, itemList, config); 
      } 
      catch (System.Exception ex) 
      { 
       return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message); 
      } 
} 
संबंधित मुद्दे