Web API 2:如何在对象及其子对象上返回带有camelCased属性名称的JSON

Tom*_*Tom 95 .net c# json.net asp.net-web-api asp.net-web-api2

UPDATE

感谢所有的答案.我正在进行一个新项目,看起来我终于找到了底层:看起来下面的代码实际上应该归咎于:

public static HttpResponseMessage GetHttpSuccessResponse(object response, HttpStatusCode code = HttpStatusCode.OK)
{
    return new HttpResponseMessage()
    {
        StatusCode = code,
        Content = response != null ? new JsonContent(response) : null
    };
}
Run Code Online (Sandbox Code Playgroud)

别处...

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");
}
Run Code Online (Sandbox Code Playgroud)

假设它是WebAPI,我忽略了看似无害的JsonContent但没有.

这在任何地方都可以使用......我能说第一个,wtf吗?或许应该是"为什么他们这样做?"


原始问题如下

人们会认为这将是一个简单的配置设置,但现在我已经躲过太久了.

我看过各种解决方案和答案:

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(); 
Run Code Online (Sandbox Code Playgroud)

Mayank的答案在这里:CamelCase JSON WebAPI子对象(嵌套对象,子对象)似乎是一个令人不满意但可行的答案,直到我意识到这些属性必须添加到生成的代码中,因为我们使用linq2sql ...

有什么方法可以自动完成吗?这个'讨厌'现在困扰着我很久了.

Aro*_*ron 165

总而言之,你得到......

protected void Application_Start()
{
    HttpConfiguration config = GlobalConfiguration.Configuration;
    config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
    config.Formatters.JsonFormatter.UseDataContractJsonSerializer = false;
}
Run Code Online (Sandbox Code Playgroud)


fel*_*x-b 27

这对我有用:

internal static class ViewHelpers
{
    public static JsonSerializerSettings CamelCase
    {
        get
        {
            return new JsonSerializerSettings {
                ContractResolver = new CamelCasePropertyNamesContractResolver()
            };
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

[HttpGet]
[Route("api/campaign/list")]
public IHttpActionResult ListExistingCampaigns()
{
    var domainResults = _campaignService.ListExistingCampaigns();
    return Json(domainResults, ViewHelpers.CamelCase);
}
Run Code Online (Sandbox Code Playgroud)

CamelCasePropertyNamesContractResolver来自Newtonsoft.Json.dllJson.NET库.

  • 当想要仅针对某些API而不是针对应用程序中的所有API的camelCasing时,此方法非常有用.(Y) (3认同)

Tom*_*Tom 14

事实证明

return Json(result);
Run Code Online (Sandbox Code Playgroud)

是罪魁祸首,导致序列化过程忽略了camelcase设置.然后

return Request.CreateResponse(HttpStatusCode.OK, result, Request.GetConfiguration());
Run Code Online (Sandbox Code Playgroud)

是我正在寻找的机器人.

json.UseDataContractJsonSerializer = true;
Run Code Online (Sandbox Code Playgroud)

把扳手放在工作中,结果证明不是我想要的机器人.


mka*_*kaj 12

所有上述答案对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();
    }
}
Run Code Online (Sandbox Code Playgroud)

关键的区别是:新的HttpConfiguration()而不是GlobalConfiguration.Configuration.

  • 如果你正在使用Owin,这个解决方案可以很好地工作,但只有在你撕掉所有头发之后! (3认同)

Jay*_*hah 9

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

        }
    }
Run Code Online (Sandbox Code Playgroud)


确保您的API Action Method以下列方式返回数据,并且您已安装最新版本的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);
        }
    }
Run Code Online (Sandbox Code Playgroud)