ServiceStack.Text 反序列化可空布尔值时的奇怪行为

ServiceStack.Text strange behavior while deserializing nullable boolean

假设我有一个 class 包含一个 bool? 类型的成员。

public class Request
{
    public bool? IsOk {get; set;}
}

我希望 ServiceStack 的 JSON 反序列化器在 JSON 字符串中除 truefalse 之外的任何值都会导致该成员的 null。 但有时会导致 false,有时会导致 null!

gistlyn 中的示例代码显示了此问题。

为什么会这样?有没有强制严格解析的配置?

默认情况下,ServiceStack 的文本序列化程序会尝试尽可能多地反序列化而不会出错。如果您希望 JSON 序列化程序抛出反序列化错误,您可以设置 JsConfig.ThrowOnError=true;(或 latest v5.1.1+ on MyGet 中的 Env.Strict=true)。

或者您可以使用以下命令将任何序列化错误记录到控制台:

Tracer.Instance = new ConsoleTracer();

行为上的差异在于,由于流行的约定,1"1""on" 等值也被视为 true 任何其他 <2 个字符视为 false。任何其他字符串值都会尝试反序列化为布尔值,例如"true""false",如果它是这些值的 none,则会导致反序列化错误,默认情况下该错误被吞没并且 属性 未设置(即 null ).

但是我已经在 this commit 中规范化了行为,所以只有像 true1tY、[=25= 这样的常规值] 反序列化为 true 及其反值 false0fNoff 反序列化为 false 和所有其他值尝试反序列化为布尔值(即 True/False),如果失败将导致反序列化错误。

此更改适用于现在 available on MyGet 的 v5.1.1。