Json.net:不要将数字反序列化为布尔值

时间:2020-02-04 22:27:40

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

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


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

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




2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我假设这是仅反序列化的情况。在这种情况下,您可以将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的操作将不会得到预期的结果,也不会正确地序列化。