当前位置: 首页 > 面试题库 >

我应该在哪里插入自定义DefaultContractResolver JSON.NET?

强德厚
2023-03-14
问题内容

我在ASP.Net中有一个WebAPI
2.0项目,在其中实现了自定义的DefaultContractResolver,以便可以控制如何使用JSON.Net将实体序列化为JSON。但是我不确定如何告诉框架使用我的自定义实现。我也想知道是否有可能更改特定控制器/动作的ContractResolver。

谢谢!

-–编辑03/07/2014我已经通过创建一个新的ConfigSettings对象并手动解析该对象来弄清楚如何使用我的自定义实现;但是,生成的JSON被序列化了两次(它具有额外的\
r \ n字符)。这是因为默认情况下,webAPI控制器会序列化响应,所以我想更改以覆盖该行为…这是正确的方法吗?


问题答案:

我只是费尽心思弄清楚自己,而我需要一个可以按要求工作的人。您可以使用该方法,只返回相同的媒体格式化程序。我发现将格式化程序设置GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ContractResolver为对于每个请求的需求都不可靠,即使我尝试在该类的单个实例中处理每个请求的需求。但是,您可以尝试在App_Start代码中的某个位置设置ContractResolver实例。

我最终创建了一个自定义JsonMediaTypeFormatter,该自定义检查是否为请求配置了ContractResolver,您可以只返回一个和相同的解析器:

public class DynamicJsonMediaTypeFormatter : JsonMediaTypeFormatter
{ 
public override MediaTypeFormatter GetPerRequestFormatterInstance(Type type, System.Net.Http.HttpRequestMessage request, System.Net.Http.Headers.MediaTypeHeaderValue mediaType)
{
// shown is getting the current formatter, but you can return an instance you prefer
  var formatter = base.GetPerRequestFormatterInstance(type, request, mediaType) as JsonMediaTypeFormatter;

// Here I had more code to get the resolver based on request, skipped
  ((JsonMediaTypeFormatter)formatter).SerializerSettings.ContractResolver = <YourContractResolverInstance>;
    return formatter;
}
}

我想您已经知道了这部分内容,但是您的合同解析器可以覆盖`CreateProperties’并让您自己的逻辑来决定将显示哪些json属性以及它们将使用什么名称(为完整性和其他读者的利益而添加):

public class DynamicContractResolver : DefaultContractResolver
{
...
 protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization){
  ...
}


 类似资料:
  • 我正在尝试为没有它们的包装提供类型: 我在带有打字稿 2.4.2 的 webpack 中使用 ts-loader,并且在 tsconfig.json 中设置了以下类型根: 我试图模仿: < code>index.d.ts中包含以下内容: 但是错误仍然存在。我做错了什么?我应该把那些自定义的. d.ts文件放在哪里? 和任何其他类型根之间有什么区别?为什么TypeScript会区别对待它们?

  • 问题内容: 当我在其中放置bean定义时,出现一条错误消息,指示Tomcat 7无法启动,因为有一个。我将整个堆栈跟踪上传到了文件共享站点,您可以通过单击此链接来阅读。但是,当我注释掉bean定义并尝试重新启动服务器时,我收到另一条错误消息,指示没有的bean定义。您可以通过单击此链接在文件共享站点上阅读第二个堆栈跟踪。 那么我应该将bean定义放在哪里,其语法应该是什么? 我认为问题可能在于,我

  • 我对资产文件夹感到困惑。它不是在Android Studio中自动创建的,几乎所有讨论这个问题的论坛都在讨论Eclipse。 在Android Studio中如何配置资产目录?

  • 问题内容: 我正在尝试使用Express和ejs渲染模板的模板。至于节点应用程序的标准结构,我有一个app.js文件,其中包含如下功能: 我有some_template.ejs文件,该文件如下所示调用此函数: 而且效果很好。但是,我大约有15-20个这样的函数,并且我不想在app.js中定义所有这些函数。还有其他地方可以定义这些函数并以与我现在相同的方式在模板中调用它们吗?如果是,那么定义它们的方

  • 很好的一天, 我有一些自定义代码从以前的非mvc应用程序。这都是单元测试之类的。现在,我需要把它放在laravel应用程序中。它们不是控制器、模型或视图?这是否意味着我必须将它们与Symfony和Swiftmailer文件夹一起放入供应商文件夹?

  • 问题内容: 我使用netfishs 6.7.1和glassfish v2.1编写了一个Web服务项目,将log4j.properties放入项目的根目录并使用: 在构造函数中: 在功能上: 但是,这是错误信息(实际上,我已经尝试将它几乎可以实现的每个目录都放入): 问题答案: 我知道回答这个问题有点晚了,也许您已经找到了解决方案,但是我将发布我找到的解决方案(在我进行大量Google搜索之后),因