感谢评论和回答。我使用输入和输出格式化程序找到了解决方案。在此感谢
http://rovani.net/Explicit-Model-Constructor/指引我朝着正确的方向发展。
我创建了自己的输入和输出格式化器,它们继承自
JsonInputFormatter
以保持尽可能多的功能相同。在构造函数中,我设置了支持的媒体类型(使用了与现有JSON类似的一些类型)。同时还必须重写
CreateJsonSerializer
以将
ContractResolver
设置为所需的内容(可以实现单例)。必须这样做,因为在构造函数中更改
serializerSettings
将更改所有输入/输出格式化器的序列化设置,这意味着默认的JSON格式化器也将使用新的合同解析器。此外,这样做还意味着您可以通过
AddMvc().AddJsonOption()
设置一些默认的JSON选项。
示例输入格式化器,输出格式化器使用相同的原则:
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)
{
}
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' }
});