我知道ASP.NET Web API本身使用Json.NET来(反)序列化对象,但有没有办法指定JsonSerializerSettings你想要它使用的对象?
例如,如果我想将type信息包含在序列化的JSON字符串中该怎么办?通常我会在.Serialize()调用中注入设置,但Web API会默默地执行此操作.我找不到手动注入设置的方法.
尝试设置JsonOutputFormatter选项:
var jsonFormatter = (JsonOutputFormatter) options.OutputFormatters.FirstOrDefault(f => f is JsonOutputFormatter);
if (jsonFormatter != null)
{
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
}
Run Code Online (Sandbox Code Playgroud)
要么
mvcBuilder.AddJsonOptions(jsonOptions =>
{
jsonOptions.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});
Run Code Online (Sandbox Code Playgroud)
但是,只要我添加这个,我得到:
MissingMethodException:找不到方法:'Newtonsoft.Json.JsonSerializerSettings Microsoft.AspNet.Mvc.Formatters.JsonOutputFormatter.get_SerializerSettings()'.
我正在使用标准 Microsoft.AspNet.Mvc.Formatters.Json (6.0.0-rc1-final)
编辑:通过安装解决它Newtonsoft.Json 6.0.6(降级所有其他参考)
有人已经有了吗?谢谢..
许多SO线程都涵盖了在应用程序级别覆盖Web API的默认JSON序列化程序设置.但是如何在动作级别配置其设置?例如,我可能想要在我的一个操作中使用camelcase属性进行序列化,但不能在其他操作中进行序列化.
在.NET世界中,当谈到对象序列化时,它通常用于在运行时检查对象的字段和属性.对此作业使用反射通常很慢,并且在处理大量对象时是不合需要的.另一种方法是使用IL发射或构建表达树,这些表现树相对于反射提供显着的性能增益.而后者是处理序列化时最现代化的库.但是,在运行时构建和发送IL需要花费时间,并且只有在将此信息缓存并重用于相同类型的对象时才会回收投资.
当使用Json.NET时,我不清楚使用上述哪种方法,如果确实使用了后者,是否使用了缓存.
例如,当我这样做时:
JsonConvert.SerializeObject(new Foo { value = 1 });
Run Code Online (Sandbox Code Playgroud)
Json.NET是否构建了Foo的成员访问信息并缓存以便以后重用它?
根据请求中的某些值(标题或URL),我想更改DTO对象的序列化.为什么?好吧,我已经应用了[JsonProperty("A")]我的DTO,但根据客户端(网站或移动应用程序),它是否想要使用该属性.我开始了
services
.AddMvc()
.AddJsonOptions(opt =>
{
#if DEBUG
opt.SerializerSettings.ContractResolver = new NoJsonPropertyNameContractResolver();
#endif
}
Run Code Online (Sandbox Code Playgroud)
因此,在调试时,我获得了具有完整属性名称的JSON.我使用该JsonProperty属性来缩短响应JSON,这适用于移动应用程序(Xamarin),后者反序列化回到相同的DTO.但现在我有一个网站使用相同的API通过jQuery获取数据,但在那里我想处理DTO的完整属性名称,而不是JsonProperty属性中给出的名称.网站和WebApi位于同一台服务器上,因此如果响应更大,则没有问题.
我开始使用中间件类来对客户标头值做出反应,这有效,但现在我不知道如何进入JSON SerializerSettings.搜索网络但找不到它.
在搜索时我读过有关InputFormatters和OutputFormatters,以及内容协商,但我不知道我必须去哪个方向.
我不想使用不同的设置两次部署相同的API.
如果这会有所帮助,我能够改变routesconfig之类的东西.
更新
不仅JSON响应必须以两种不同的方式序列化,而且反序列化必须以两种不同的方式完成.
我需要将小数的输出json格式化为货币,并在要序列化的对象中指定文化,对象可以嵌套,因此无法在序列化器中预设选项。我当前的操作方式是使用额外的字符串属性来格式化输出。
[JsonIgnore]
public decimal Cost {get;set;}
[JsonIgnore]
public CultureInfo Culture {get;set;}
public string AsCurrency(decimal value) {
return string.Format(this.Culture, "{0:c}", value);
}
[JsonProperty("FormattedCost")]
public string FormatedCost {
get { return this.AsCurrency(this.Cost); }
}
Run Code Online (Sandbox Code Playgroud)
我有很多要处理的属性,我不介意反序列化,另一种语言使用JsonObject填充PDF,所以我想要字符串值。
理想情况下,我想要一个,JsonConverter所以我可以做
[JsonProperty("FormattedCost")]
[JsonConverter(typeof(MyCurrencyConverter))]
public decimal Cost {get;set;}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何访问转换器中包含对象的Culture属性。
public class MyCurrencyConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var culture = // How do I get the Culture from the parent object?
writer.WriteValue(string.format(culture, "{0:c}", (decimal)value);
}
public override object …Run Code Online (Sandbox Code Playgroud)