Json. net: не делать сериализацию чисел как булевых - PullRequest
0 голосов
/ 05 февраля 2020

Есть ли какие-либо встроенные настройки в 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 ]

1 голос
/ 05 февраля 2020

Вы не должны использовать разные типы в одном свойстве, чтобы получить один bool результат. Но если вы sh не будете объявлять один пользовательский 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);
0 голосов
/ 05 февраля 2020

Я предполагаю, что это только десериализованная ситуация. Если это так, вы можете поместить ваше int значение go в 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 не будет иметь ожидаемых результатов и не будет корректно сериализироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...