假设我有一个包含bool?
类型成员的类。
public class Request
{
public bool? IsOk {get; set;}
}
我希望ServiceStack的JSON反序列化器能够使该成员的JSON字符串中除true
或false
以外的任何值都产生null
。
但是有时会导致false
,有时会导致null
!
gistlyn中有一个示例代码显示了此问题。
为什么会这样?是否有任何配置可以强制严格解析?
答案 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中的行为进行了规范化,因此仅常规值(如true
,1
,t
,Y
,on
会反序列化设为 true ,它们的对数值false
,0
,f
,N
,off
反序列化为 false ,其他所有值都将尝试反序列化为布尔值(即True / False),如果失败,将导致反序列化错误。
此更改可从v5.1.1(现在为available on MyGet)中获得。