2014-10-20 5 views
11

Ich versuche, camel-cased JSON von einem ASP.Net Web API 2-Controller zurückzugeben. Ich habe eine neue Webanwendung mit nur den ASP.Net MVC- und Web-API-Bits erstellt. Ich die ValuesController entführt etwa so:Zurückgeben von camelCased-JSON von der Web-API

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

Ausführen dieses in IE, erhalte ich folgende Ergebnisse:

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

Nach K. Scott Allen's post zum Thema, habe ich folgendes in die Register-Methode in der WebApiConfig. CS-Datei:

Allerdings bekomme ich immer noch das gleiche, Capitisolation in meinen Ergebnissen. Gibt es etwas, das mir fehlt? Ich habe ein paar andere Ansätze ausprobiert, aber noch nichts funktioniert.

+0

Ist das so eine offensichtliche Antwort, dass die Leute denken, ich sollte das selbst herausfinden? Ich habe noch kein Knabberzeug. Ich habe mit einem neuen Projekt begonnen und konnte das immer noch nicht schaffen. – beaudetious

+0

Ich denke immer noch Antwort von einem anderen Beitrag ist die anständigste: http://StackOverflow.com/A/22130487/1915401 – Xinan

Antwort

9

Sieht aus wie das Hauptproblem war, dass ich die JsonResult Abkürzung Json() -Aktion Ergebnis Methode wurde mit:

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

Es hatte offenbar die volle Kontrolle über die Ergebnisse der Formatierung. Wenn ich auf die Rückkehr wechseln HttpResponseMessage dann funktioniert es wie erwartet:

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

Ich habe am Ende Datei mit dem Code-Block in der WebApiConfig als Omar.Alani vorgeschlagen (im Gegensatz zu den viel längeren Code, den ich in meinem OP hatte) . Aber der wahre Schuldige war die JsonResult-Aktionsmethode. Ich hoffe, dass dies jemand anderem hilft.

+5

Ich weiß, dass dies ein ziemlich später Kommentar ist, aber ich fand, dass die Verwendung von 'Ok (authInfo)' den Formatierer anwendet, während 'Json (authInfo)' nicht tut. Die "Ok" -Methode würde den relevanten Formatierer basierend auf dem "Accept" -Header anwenden. Sie könnten dann immer noch "IHttpActionResult" zurückgeben. –

15

In Ihrem WebApiConfig.cs stellen Sie sicher, diese beiden Linien

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

stellen Sie sicher, dass Sie Newtonsoft Bibliothek installiert hinzuzufügen.

Hoffe, dass hilft.

+0

Nein, bereits versucht, dass und Newtonsoft bereits installiert ist. :( – beaudetious

+0

Ich hatte ein ähnliches Problem, müssen Sie den Formatierer aus der httpconfig für owin nicht GlobalConfiguration –

+0

@LukeDeFeo können Sie Code anzeigen, wie Sie den Formatierer von httpconfig von owin bekommen? – Dmitry

1

Ich benutzte Owin und DI (AutoFac in meinem Fall), so dass ein weiterer Schraubenschlüssel ins Werk wirft. Mein Startup.cs enthält:

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

Da ist in meinem WebApiConfig.cs ich habe:

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

Sie benötigen OK() statt Json() in der Aktionsmethoden zu verwenden.

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

In Register-Methode von WebApiConfig, fügen Sie diese

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

Voll Code of 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(); 

     } 
    } 


Stellen Sie sicher, neueste Version von Json.Net/Newtonsoft installiert haben.Json installiert und Ihre API Aktion Methode gibt Daten in folgenden Weise:

[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

dies auch versuchen.

[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); 
      } 
} 
Verwandte Themen