【问题标题】:ServiceStack.Text strange behavior while deserializing nullable boolean反序列化可为空的布尔值时 ServiceStack.Text 的奇怪行为
【发布时间】:2018-07-17 07:07:06
【问题描述】:

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

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

我希望 ServiceStack 的 JSON 反序列化器在 JSON 字符串中除 true 或 false 之外的任何值都会导致该成员的 null。 但有时会导致false,有时会导致null!

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

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

【问题讨论】:

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


    【解决方案1】:

    默认情况下,ServiceStack 的文本序列化器会尝试尽可能多地反序列化而不会出错。如果您希望 JSON 序列化程序引发反序列化错误,您可以设置 JsConfig.ThrowOnError=true;(或 Env.Strict=true 中的 latest v5.1.1+ on MyGet)。

    或者您可以使用以下命令将任何序列化错误记录到控制台:

    Tracer.Instance = new ConsoleTracer();
    

    不同之处在于,由于流行的约定,1、"1" 和"on" 等值也被视为true,任何其他false。任何其他字符串值都尝试反序列化为布尔值,例如"true" 或 "false",如果不是这些值,则会导致反序列化错误,默认情况下会被吞下并且该属性未设置(即 null)。

    但是我已经规范化了 this commit 中的行为,所以只有像 true、1、t、Y、on 这样的常规值反序列化为 true 及其反序列化值false、0、f、N、off 反序列化为 false 并且所有其他值尝试反序列化为布尔值(即 True/False),并将导致如果失败则反序列化错误。

    此更改从 v5.1.1 开始可用,现在为 available on MyGet。

    【讨论】:

    • 在我的情况下没有反序列化错误。 “fu”既不是 JsConfig.ThrowOnDeserializationError = true; 不会导致错误。我已经阅读了代码,length <= 2 是正确的(不是
    • @a3dho3yn 2 chars 并在其下解析为 bool 值,当它与 true 值不匹配时为 false。它现在检查特定的真/假值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2021-12-31
    相关资源
    最近更新 更多