感谢 cmets 和答案。我找到了输入和输出格式化程序的解决方案。感谢http://rovani.net/Explicit-Model-Constructor/ 为我指明了正确的方向。
我创建了自己的输入和输出格式化程序,它们继承自 JsonInputFormatter,以保持尽可能多的功能相同。
在构造函数中,我设置了支持的媒体类型(使用了一些看起来像现有 JSON 的媒体类型)。
还必须覆盖 CreateJsonSerializer 以将 ContractResolver 设置为所需的(可以实现单例)。
必须这样做,因为在构造函数中更改 serializerSettings 会更改所有输入/输出格式化程序的序列化程序设置,这意味着默认的 JSON 格式化程序也将使用新的合同解析程序。
这样做也意味着您可以通过AddMvc().AddJsonOption() 设置一些默认的 JSON 选项
示例inputformatter,outputformatter使用相同的原理:
static MediaTypeHeaderValue protoMediaType = MediaTypeHeaderValue.Parse("application/jsonfull");
public JsonFullInputFormatter(ILogger logger, JsonSerializerSettings serializerSettings, ArrayPool<char> charPool, ObjectPoolProvider objectPoolProvider)
: base(logger, serializerSettings, charPool, objectPoolProvider)
{
this.SupportedMediaTypes.Clear();
this.SupportedMediaTypes.Add(protoMediaType);
}
protected override JsonSerializer CreateJsonSerializer()
{
var serializer = base.CreateJsonSerializer();
serializer.ContractResolver = new NoJsonPropertyNameContractResolver();
return serializer;
}
根据上面提到的安装类 URL:
public class YourMvcOptionsSetup : IConfigureOptions<MvcOptions>
{
private readonly ILoggerFactory _loggerFactory;
private readonly JsonSerializerSettings _jsonSerializerSettings;
private readonly ArrayPool<char> _charPool;
private readonly ObjectPoolProvider _objectPoolProvider;
public YourMvcOptionsSetup(ILoggerFactory loggerFactory, IOptions<MvcJsonOptions> jsonOptions, ArrayPool<char> charPool, ObjectPoolProvider objectPoolProvider)
{
//Validate parameters and set fields
}
public void Configure(MvcOptions options)
{
var jsonFullInputFormatter = new JsonFullInputFormatter(
_loggerFactory.CreateLogger<JsonFullInputFormatter>(),
_jsonSerializerSettings,
_charPool,
_objectPoolProvider
);
options.InputFormatters.Add(jsonFullInputFormatter);
options.OutputFormatters.Add(new JsonFullOutputFormatter(
_jsonSerializerSettings,
_charPool
));
}
然后是一个扩展方法来注册它:
public static class MvcBuilderExtensions
{
public static IMvcBuilder AddJsonFullFormatters(this IMvcBuilder builder)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
ServiceDescriptor descriptor = ServiceDescriptor.Transient<IConfigureOptions<MvcOptions>, YourMvcOptionsSetup>();
builder.Services.TryAddEnumerable(descriptor);
return builder;
}
}
拨打ConfigureServices:
services.AddMvc(config =>
{
config.RespectBrowserAcceptHeader = true; // To use the JsonFullFormatters if clients asks about it via Accept Header
})
.AddJsonFullFormatters() //Add our own JSON Formatters
.AddJsonOptions(opt =>
{
//Set up some default options all JSON formatters must use (if any)
});
现在我们的 Xamarin 应用可以访问 webapi 并接收带有通过 JsonProperty 属性设置的(短)属性名称的 JSON。
在网站中,我们可以通过添加 Accept(get 调用)和 ContentType(post/put 调用)标头来获取完整的 JSON 属性名称。我们通过 jQuery 的$.ajaxSetup( 执行一次。
$.ajaxSetup({
contentType: "application/jsonfull; charset=utf-8",
headers: { 'Accept': 'application/jsonfull' }
});