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

时间:2018-07-17 07:07:07

标签: .net json servicestack json-deserialization servicestack-text

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

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

我希望ServiceStack的JSON反序列化器能够使该成员的JSON字符串中除truefalse以外的任何值都产生null。 但是有时会导致false,有时会导致null

gistlyn中有一个示例代码显示了此问题。

为什么会这样?是否有任何配置可以强制严格解析?

1 个答案:

答案 0 :(得分:2)

默认情况下,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",如果都不是这些值,则将导致反序列化错误,默认情况下该错误会被反序列化并且属性未设置(即null)。

但是我已经对this commit中的行为进行了规范化,因此仅常规值(如true1tYon会反序列化设为 true ,它们的对数值false0fNoff反序列化为 false ,其他所有值都将尝试反序列化为布尔值(即True / False),如果失败,将导致反序列化错误。

此更改可从v5.1.1(现在为available on MyGet)中获得。