首页 > 解决方案 > 反序列化可为空的布尔值时 ServiceStack.Text 的奇怪行为

问题描述

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

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

我希望 ServiceStack 的 JSON 反序列化器能够为该成员生成 JSON 字符串以外的任何值truefalseJSON 字符串中的任何值。null但有时它会导致false,有时它会导致null

gistlyn中有一个示例代码显示了这个问题。

为什么会这样?有没有强制严格解析的配置?

标签: .netjsonservicestackjson-deserializationservicestack-text

解决方案


默认情况下,ServiceStack 的文本序列化程序会尝试尽可能多地反序列化而不会出错。如果您希望 JSON 序列化程序引发反序列化错误,您可以设置JsConfig.ThrowOnError=true;(或Env.Strict=trueMyGet 上的最新 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 上使用


推荐阅读