谢谢迈克,那行得通。但我认为这种方法除了控制字符外,还转义了所有非 ASCII Unicode 字符。
我希望我的数据中有很多外语字符(例如阿拉伯语),因此这将导致显着的大小膨胀,而不是仅在 JSON 中包含那些未转义的 unicode 字符(仍然符合标准)。
我想 EscapeUnicode = true 的目的是生成可以使用简单的 ASCII 编码存储或传输的 JSON,这当然很有用。而且它显然还将ASCII控制字符编码为确实解决了我的问题的副作用。
但在我看来,无论 EscapeUnicode 设置如何,JsonSerializer 都应该转义控制字符,因为标准需要它。我认为这是一个错误。
由于这主要是我的 Service Stack 服务中的一个问题,我还找到了这个解决方案:
SetConfig(new EndpointHostConfig
{
UseBclJsonSerializers = true
});
这告诉 Service Stack 使用 .NET 的内置 DataContractJsonSerializer 而不是 Service Stack 的 JsonSerializer。我已经验证 DataContractJsonSerializer 确实可以正确转义 control.characters。
所以看来我需要在 EscapeUnicode = true 的 JsonSerializer (速度更快但输出臃肿)和 DataContractJsonSerializer (速度较慢但紧凑的 Unicode 输出)之间进行选择。