UPDATE
すべての答えをありがとう。私は新しいプロジェクトに取り組んでおり、最終的にこれの一番下に到達したように見えます:実際に次のコードが非難したようです:
public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
return new HttpResponseMessage()
{
StatusCode = code,
Content = response != null ? new JsonContent(response) : null
};
}
他の場所...
public JsonContent(object obj)
{
var encoded = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.None, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore } );
_value = JObject.Parse(encoded);
Headers.ContentType = new MediaTypeHeaderValue("application/json");
}
私はそれがWebAPIであると仮定して、無害に見えるJsonContentを見落としていました。
これはeverywhere...を使用しています。または、「なぜ彼らはこれをしているのですか?」
元の質問が続きます
これは単純な構成設定だと思っていたかもしれませんが、今はあまりにも長い間私を避けていました。
私はさまざまなソリューションと答えを見てきました:
https://Gist.github.com/rdingwall/2012642
最新のWebAPIバージョンには適用されないようです...
以下は機能しないようです-プロパティ名はまだPascalCasedです。
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.UseDataContractJsonSerializer = true;
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore;
json.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
Mayankの回答: CamelCase JSON WebAPI Sub-Objects(Nested objects、child objects) linq2sqlを使用しているため、これらの属性を生成コードに追加する必要があると気付くまでは、満足のいくものではなく、実行可能な答えのように見えました。 ..
これを自動的に行う方法はありますか?この「厄介な」ことは私を長い間悩ませてきました。
すべてをまとめると...
protected void Application_Start()
{
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
}
これは私のために働いたものです:
internal static class ViewHelpers
{
public static JsonSerializerSettings CamelCase
{
get
{
return new JsonSerializerSettings {
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
}
}
}
その後:
[HttpGet]
[Route("api/campaign/list")]
public IHttpActionResult ListExistingCampaigns()
{
var domainResults = _campaignService.ListExistingCampaigns();
return Json(domainResults, ViewHelpers.CamelCase);
}
クラスCamelCasePropertyNamesContractResolver
は、 Json.NET ライブラリのNewtonsoft.Json.dll
に由来します。
それが判明した
return Json(result);
犯人であり、シリアル化プロセスでキャメルケース設定を無視していました。そしてそれ
return Request.CreateResponse(HttpStatusCode.OK, result, Request.GetConfiguration());
私が探していたドロイドでした。
また
json.UseDataContractJsonSerializer = true;
作品にスパナを入れて、私が探していたドロイドではないことが判明しました。
Owin HostingとNinjectでは、上記のすべての答えがうまくいきませんでした。ここに私のために働いたものがあります:
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
// Get the ninject kernel from our IoC.
var kernel = IoC.GetKernel();
var config = new HttpConfiguration();
// More config settings and OWIN middleware goes here.
// Configure camel case json results.
ConfigureCamelCase(config);
// Use ninject middleware.
app.UseNinjectMiddleware(() => kernel);
// Use ninject web api.
app.UseNinjectWebApi(config);
}
/// <summary>
/// Configure all JSON responses to have camel case property names.
/// </summary>
private void ConfigureCamelCase(HttpConfiguration config)
{
var jsonFormatter = config.Formatters.JsonFormatter;
// This next line is not required for it to work, but here for completeness - ignore data contracts.
jsonFormatter.UseDataContractJsonSerializer = false;
var settings = jsonFormatter.SerializerSettings;
#if DEBUG
// Pretty json for developers.
settings.Formatting = Formatting.Indented;
#else
settings.Formatting = Formatting.None;
#endif
settings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
主な違いは、GlobalConfiguration.Configurationではなく、新しいHttpConfiguration()です。
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 }
);
//This line sets json serializer's ContractResolver to CamelCasePropertyNamesContractResolver,
// so API will return json using camel case
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
}
APIアクションメソッドが次の方法でデータを返し、Json.Net/Newtonsoft.Jsonの最新バージョンがインストールされていることを確認してください。
[HttpGet]
public HttpResponseMessage List()
{
try
{
var result = /*write code to fetch your result*/;
return Request.CreateResponse(HttpStatusCode.OK, cruises);
}
catch (Exception ex)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError, ex.Message);
}
}
Owin Startupに次の行を追加してください...
public class Startup
{
public void Configuration(IAppBuilder app)
{
var webApiConfiguration = ConfigureWebApi();
app.UseWebApi(webApiConfiguration);
}
private HttpConfiguration ConfigureWebApi()
{
var config = new HttpConfiguration();
// ADD THIS LINE HERE AND DONE
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.MapHttpAttributeRoutes();
return config;
}
}
ルート属性がGET urlと一致しなかったが、GET urlはメソッド名と一致した場合、jsonserializerキャメルケースディレクティブは無視されます。
//uppercase fail cakes
[HttpGet]
[Route("countries")]
public async Task<GeoData> GeoData()
{
return await geoService.GetGeoData();
}
//lowercase nomnomnom cakes
[HttpGet]
[Route("geodata")]
public async Task<GeoData> GeoData()
{
return await geoService.GetGeoData();
}
次の方法で解決しました。
[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);
}
}
BreezeでWebApiを使用していますが、Breezeコントローラーで非Breezeアクションを実行しようとしたときに同じ問題が発生しました。 Apprach Request.GetConfigurationを使用しようとしましたが、同じ結果になりました。したがって、Request.GetConfigurationによって返されたオブジェクトにアクセスすると、requestで使用されるシリアライザーは、ブリーズサーバーが魔法を作るために使用するシリアライザーであることがわかります。とにかく、別のHttpConfigurationを作成することで問題を解決しました。
public static HttpConfiguration BreezeControllerCamelCase
{
get
{
var config = new HttpConfiguration();
var jsonSerializerSettings = config.Formatters.JsonFormatter.SerializerSettings;
jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonSerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
return config;
}
}
次のようにRequest.CreateResponseでパラメーターとして渡します。
return this.Request.CreateResponse(HttpStatusCode.OK, result, WebApiHelper.BreezeControllerCamelCase);