.netcore3.1 内置序列化在设置全局序列化 Encoder 配置的情况下还是无效

2020-05-09 08:38发布

问题:

需求:system.text.json.JsonSerializer.Serialize(returnData) ,由于 returnData 对象种的的其中一个属性是中文的。当我调用上面这个方法时,序列化出来的还是转码之后的字符集。
我在 startup 设置了全局序列化配置项

services.AddControllers().AddJsonOptions(config =>
 {
       Encoder = System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping;
  });

结果控制器端调用 JsonSerializer.Serialize(returnData) 还是中文转码字符集
刚开始以为 UnsafeRelaxedJsonEscaping 没效果,就按 https://q.cnblogs.com/q/115234/ 上的问题全部来一遍,发现还是不行。

之后我做了以下措施:
在控制器注入 JsonOption 发现我之前加的全局设置都存在。但是不知在使用这个方法时没效果。
后来我在源码上看到这么一行代码
JsonSerializer.Serialize 在没有传 setting 的时候是调用了 JsonSerializerOptions.s_defaultOptions 这个单例对象,但是往后查我就不知道是在哪里进行赋值的了,而且在我另一个项目这么写是没问题的。
所以想请问下,这种情况是什么原因导致的?

备注:直接调用 JsonSerializer.Serialize(returnData, option) 这样是没有问题的

我所有的分都上了

回答1:

.net core 3.1 还不支持全局设置 JsonSerializer 的 JsonSerializerOptions ,需要在 Serialize 方法中传入。

var json = JsonSerializer.Serialize(
    new { Title = "代码改变世界" },
    new JsonSerializerOptions { Encoder = JavaScriptEncoder.Create(UnicodeRanges.All) });

详见 How to globally set default options for System.Text.Json.JsonSerializer?