问题:
需求: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?