ServiceStack.Text 反序列化可空布尔值时的奇怪行为
ServiceStack.Text strange behavior while deserializing nullable boolean
假设我有一个 class 包含一个 bool?
类型的成员。
public class Request
{
public bool? IsOk {get; set;}
}
我希望 ServiceStack 的 JSON 反序列化器在 JSON 字符串中除 true
或 false
之外的任何值都会导致该成员的 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 中规范化了行为,所以只有像 true
、1
、t
、Y
、[=25= 这样的常规值] 反序列化为 true 及其反值 false
、0
、f
、N
、off
反序列化为 false 和所有其他值尝试反序列化为布尔值(即 True/False),如果失败将导致反序列化错误。
此更改适用于现在 available on MyGet 的 v5.1.1。
假设我有一个 class 包含一个 bool?
类型的成员。
public class Request
{
public bool? IsOk {get; set;}
}
我希望 ServiceStack 的 JSON 反序列化器在 JSON 字符串中除 true
或 false
之外的任何值都会导致该成员的 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 中规范化了行为,所以只有像 true
、1
、t
、Y
、[=25= 这样的常规值] 反序列化为 true 及其反值 false
、0
、f
、N
、off
反序列化为 false 和所有其他值尝试反序列化为布尔值(即 True/False),如果失败将导致反序列化错误。
此更改适用于现在 available on MyGet 的 v5.1.1。