【问题标题】:Json.net : Do not derserialize numbers as booleansJson.net:不要将数字反序列化为布尔值
【发布时间】:2020-05-20 19:36:19
【问题描述】:

json.net 中是否有任何内置设置来禁用将数字转换为布尔值。我更希望它返回错误:(无需为每个具有 bool 属性的类编写自定义转换器)


    public class MyClass
    {
        public bool flag { get; set; }
    }

    var str = @"{"flag":123}";
    MyClass result = JsonConvert.DeserializeObject<MyClass>(str) ; // flag is true !




【问题讨论】:

  • 序列化程序不会将 bool 序列化为 123...嗯,不是一个很好的工作
  • 是的,但是如果数据是由用户手动输入的呢
  • 您不需要为每个类使用自定义转换器。
  • 您需要先自行清理这些数据。在这种情况下,bool 被 JSON.NET 明确定义为非零为true,零为false。您的软件不应允许输入您不想要的数字。
  • 您永远不能将"I like pie" 或任何非布尔值存储在类的布尔字段中以便进行序列化,因此这似乎是一个XY 问题

标签: c# .net json json.net deserialization


【解决方案1】:

您不应该在一个属性中使用不同的类型来获得一个bool 结果。 但是,如果您不想为类中的每个属性声明一个自定义 JsonConvert,您始终可以在代码中创建 DefaultSettings。

void Initialize()
{
    JsonConvert.DefaultSettings = () => new JsonSerializerSettings
    {
        Converters = new List<JsonConverter>
        {
            new BoolJsonConverter()
        }
    };
}

// Create JsonConvert you want to add to DefaultSettings
public class BoolJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(bool);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {

    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {

    }
}

var json = @"{""flag"":123}"
var myClass = JsonConvert.DeserializeObject<MyClass>(json);

【讨论】:

【解决方案2】:

我假设这是仅反序列化的情况。如果是这种情况,您可以将您的int 值放入int 并使用另一个变量来保存bool。类似的东西 -

public class MyClass
{
    public int flagInt { get; set; }

    [JsonIgnore]
    public bool flag
    {
        get
        {
            switch (flagInt)
            {
                case 0: return false;
                case 1: return true;
                default: throw new Exception("Cannot convert flag to bool");
            }
        }
    }
}

请注意,我在 flag 上没有设置器,因此执行 flag = false 之类的操作不会产生预期结果,也不会正确序列化。

【讨论】:

  • 好技巧,但需要在应用程序的每个类的每个布尔属性上实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-05
  • 2017-03-21
相关资源
最近更新 更多