3

ServiceStack 的 JsonSerializer 似乎没有正确编码控制字符。

例如,这个 C# 表达式....

JsonSerializer.SerializeToString(new { Text = "\u0010" })

...评价这个...

{"Text":"?"}

...“?”在哪里?是文字控制字符。

相反,根据http://www.json.org它应该评估为:

{"Text":"\u0010"}

这是一个已知的错误还是我错过了什么?

我的服务输出的错误 JSON 导致我的服务使用者在反序列化期间出错。

4

2 回答 2

1

谢谢迈克,那行得通。但我认为这种方法除了控制字符外,还转义了所有非 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 输出)之间进行选择。

于 2013-08-27T18:47:24.923 回答
1

您需要告诉序列化程序转义 unicode 字符。

JsConfig.EscapeUnicode = true;
JsonSerializer.SerializeToString(new{Text = "\u0010"});

上面的评估结果如下:

{"Text":"\u0010"}
于 2013-08-27T16:38:07.277 回答