.net - 反序列化可为空的布尔值时 ServiceStack.Text 的奇怪行为
问题描述
假设我有一个包含类型成员的bool?
类。
public class Request
{
public bool? IsOk {get; set;}
}
我希望 ServiceStack 的 JSON 反序列化器能够为该成员生成 JSON 字符串以外的任何值true
或false
JSON 字符串中的任何值。null
但有时它会导致false
,有时它会导致null
!
gistlyn中有一个示例代码显示了这个问题。
为什么会这样?有没有强制严格解析的配置?
解决方案
默认情况下,ServiceStack 的文本序列化程序会尝试尽可能多地反序列化而不会出错。如果您希望 JSON 序列化程序引发反序列化错误,您可以设置JsConfig.ThrowOnError=true;
(或Env.Strict=true
在MyGet 上的最新 v5.1.1+ 中)。
或者,您可以使用以下命令将任何序列化错误记录到控制台:
Tracer.Instance = new ConsoleTracer();
行为上的区别在于,由于流行的约定值,例如1
,"1"
并且"on"
也被视为true
任何其他 <2 字符被视为false
. 任何其他字符串值都尝试反序列化为布尔值,例如"true"
or "false"
,如果这些值都不是,则会导致反序列化错误,默认情况下会被吞下并且该属性未设置(即null
)。
但是我已经规范化了这个提交中的行为,所以只有常规值,如true
, 1
, t
, Y
,on
反序列化为true并且它们的相反值false
, 0
, f
, N
,off
反序列化为false 并且所有其他值都试图反序列化为布尔值(即 True/False)并且将如果失败会导致反序列化错误。
此更改可从 v5.1.1 开始,现在可在 MyGet 上使用。
推荐阅读
- java - RecycerView 不会显示加载的项目
- python - 硒蟒 | 'find_elements_by_class_name' 不返回任何内容
- ios - React Native - iOS - 无效的`Podfile`文件:nil:NilClass的未定义方法`[]'
- tensorflow - 使用 tensorflow 创建点的二维张量
- node.js - 我如何在 adonis.js 上使用多个模型 jwt auth
- python - 使用带有 Python 的 Gmail API 获取消息,然后发送到另一封电子邮件
- javascript - javascript对象声明中的反引号
- vb.net - 逐步拆分多行文本框
- html - CSS:强制 div 重叠其下方的内容
- c - C 递归与内存