假设我有一个包含类型为 bool?
的成员的类。
public class Request
{
public bool? IsOk {get; set;}
}
我希望 ServiceStack 的 JSON 反序列化器在 JSON 字符串中除 true
或 false
之外的任何值都会导致该成员的 null
。
但有时会导致 false
,有时会导致 null
!
gistlyn中有示例代码这表明了这个问题。
为什么会这样?有没有强制严格解析的配置?
最佳答案
默认情况下,ServiceStack 的文本序列化程序会尝试尽可能多地反序列化而不会出错。如果您希望 JSON 序列化程序抛出反序列化错误,您可以设置 JsConfig.ThrowOnError=true;
(或 Env.Strict=true
in latest v5.1.1+ on MyGet)。
或者您可以使用以下命令将任何序列化错误记录到控制台:
Tracer.Instance = new ConsoleTracer();
行为上的区别在于,由于流行的约定,1
、"1"
和 "on"
等值也被视为true
任何其他 <2 个字符都被视为 false
。任何其他字符串值都会尝试反序列化为 bool 值,例如“true”
或 “false”
,如果不是这些值,则会导致反序列化错误,默认情况下该错误被吞没并且属性未设置(即 空
).
但我已经在 this commit 中规范化了行为所以只有 true
、1
、t
、Y
、on
等常规值反序列化为 true 及其相反值 false
、0
、f
、N
、off
反序列化为 false,所有其他值尝试反序列化为 bool 值(即 True/False),如果失败将导致反序列化错误。
此更改从 v5.1.1 开始提供,现在是 available on MyGet .
关于.net - ServiceStack.Text 在反序列化可为 null 的 bool 值时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375205/