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.dll
于Json.NET库.
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.
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)
归档时间: |
|
查看次数: |
79819 次 |
最近记录: |