.net - ServiceStack.Text 在反序列化可为 null 的 bool 值时出现奇怪的行为

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

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

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

我希望 ServiceStack 的 JSON 反序列化器在 JSON 字符串中除 truefalse 之外的任何值都会导致该成员的 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 中规范化了行为所以只有 true1tYon 等常规值反序列化为 true 及其相反值 false0fNoff 反序列化为 false,所有其他值尝试反序列化为 bool 值(即 True/False),如果失败将导致反序列化错误。

此更改从 v5.1.1 开始提供,现在是 available on MyGet .

关于.net - ServiceStack.Text 在反序列化可为 null 的 bool 值时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51375205/

相关文章:

c# - 在长时间未使用后保持 .NET alt-tab 替换响应的策略?

ios - 使用 JSON 的 uitableview 部分出现问题

mysql - 如何从 JSON 列获取所有不同的属性名称?

c# - 与 ServiceStack.OrmLite 的左连接返回一个空对象而不是 null

c# - Linq to Sql 选择具有嵌套数的项目

c# - HttpBrowserCapabilities缺少一些信息?

c# - 自定义通用集合 - 重构它的最佳方法是什么?

json - 查看JSON键值

c# - 选择语句抛出 null 异常

ServiceStack 许可模型