【问题标题】:Set default global json serializer settings设置默认全局 json 序列化程序设置
【发布时间】:2021-11-22 08:35:46
【问题描述】:

我正在尝试在我的global.asax 中设置这样的全局序列化程序设置。

var formatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
formatter.SerializerSettings = new JsonSerializerSettings
{
    Formatting = Formatting.Indented,
    TypeNameHandling = TypeNameHandling.Objects,
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

当使用以下代码序列化对象时,不使用全局序列化器设置?

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StringContent(JsonConvert.SerializeObject(page))
};

不能像这样设置全局序列化程序设置还是我遗漏了什么?

【问题讨论】:

    标签: c# json asp.net-web-api json.net asp.net-mvc-5


    【解决方案1】:

    接受的答案对我不起作用。在 .netcore 中,我可以使用...

    services.AddMvc(c =>
                     {
                     ....
                     }).AddJsonOptions(options => {
                         options.SerializerSettings.Formatting = Formatting.Indented;
                         ....
                     })
    

    【讨论】:

    • 如果您使用 JsonConvert 进行任何手动序列化/反序列化,则需要使用上面接受的答案。因此,如果您想要保持一致性,则需要同时设置两者。
    【解决方案2】:

    只需在您的操作中执行以下操作,即可返回内容协商的响应,并且您的格式化程序设置也可以生效。

    return Request.CreateResponse(HttpStatusCode.OK, page);
    

    【讨论】:

    • 这就像一个魅力,使用Request.CreateResponse而不是像我在解决方案中那样创建new HttpResponseMessage有什么优点或缺点吗?
    • 是的,你会失去内容协商...例如,如果一个请求来自application/xml,你仍然会发回json数据...
    【解决方案3】:

    您对设置序列化程序的位置是正确的。但是,当使用请求的 JSON 内容类型向您的站点发出请求时,将使用该序列化程序。它不是调用 SerializeObject 时使用的设置的一部分。您可以通过属性公开定义 global.asax 的 JSON 序列化设置来解决此问题。

    public static JsonSerializerSettings JsonSerializerSettings
    {
        get
        {
            return GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings;
        }
    }
    

    然后在控制器中进行序列化时使用此属性设置序列化设置:

    return new HttpResponseMessage(HttpStatusCode.OK)
    {
        Content = new StringContent(JsonConvert.SerializeObject(page, WebApiApplication.JsonSerializerSettings))
    };
    

    【讨论】:

      【解决方案4】:

      设置JsonConvert.DefaultSettings 成功了。

      JsonConvert.DefaultSettings = () => new JsonSerializerSettings
      {
          Formatting = Formatting.Indented,
          TypeNameHandling = TypeNameHandling.Objects,
          ContractResolver = new CamelCasePropertyNamesContractResolver()
      };
      

      【讨论】:

      • 我必须将GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings 设置为同一个对象,以确保在任何地方都可以使用此配置。 (在这种情况下:通过 webapi 并通过 JsonConvert 手动调用)
      • 这根本不起作用。设置被完全忽略。
      • 完美运行。在我的例子中,它是一个从 ASP.NET Core 项目中使用的外部库。我在 Startup (ConfigureServices) 中添加了以下代码
      • 顺便说一句,也许最好存储单例而不是每次都运行“new JsonSerializerSettings”?你怎么看?
      猜你喜欢
      • 2013-01-13
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多