Логическая сериализация JSonNet

Быстрый вопрос:

В JSONNet - как получить bool true / false для сериализации как bool 1/0

Я могу видеть, как мы обрабатываем нулевые значения, и все, что просто не может найти, как это сделать.

Это возможно?

Ответы на вопрос(3)

Решение Вопроса

[TestFixture]
public class CustomJsonSerialization
{
    [Test]
    public void Test()
    {
        string serializeObject = JsonConvert.SerializeObject(true, new BoolConverter());
        Assert.That(serializeObject, Is.EqualTo("1"));
        var deserializeObject = JsonConvert.DeserializeObject<bool>(serializeObject, new BoolConverter());
        Assert.That(deserializeObject, Is.True);
    }
}

public class BoolConverter : JsonConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        writer.WriteValue(((bool)value) ? 1 : 0);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return reader.Value.ToString() == "1";
    }

    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(bool);
    }
}
 Ajay Suwalka20 окт. 2014 г., 07:43
Привет, Дэвид, я бы спросил, не получил бы я твой ответ. Но это просто еще одно дополнение к вашему ответу. Я думал, что вы могли бы помочь лучше и уменьшить дублирование
 David Peden18 окт. 2014 г., 17:07
Вы должны задать новый вопрос, а не оставлять комментарии.
 Ajay Suwalka16 окт. 2014 г., 11:45
Привет Это только обрабатывает, если мое значение «1», что если я передам 2 вместо 1, он также будет преобразован в ложь
 Ajay Suwalka17 окт. 2014 г., 13:57
Я должен вернуть ошибку состояния модели в случае, если пользователь проходит два. Как справиться с этим
 David Peden17 окт. 2014 г., 00:56
Просто используйте любую логику. Пример кода должен показать, как сделать то, что вы просите.

Вдохновленэтот ответ в аналогичном вопросе это можно решить следующим образом.

[JsonIgnore]
public bool SomeFlag { get; set; }

[JsonProperty(nameof(SomeFlag))]
public int SomeFlagAsInt
{
    get => SomeFlag ? 1 : 0;
    set => SomeFlag = value > 0;
}

если кому-то это нужно. Это также обрабатывает обнуляемый логический

Imports Newtonsoft.Json

Public Class MyBooleanConverter
    Inherits JsonConverter

Public Overrides ReadOnly Property CanWrite As Boolean
    Get
        Return True
    End Get
End Property

Public Overrides Sub WriteJson(writer As JsonWriter, value As Object, serializer As JsonSerializer)
    Dim boolVal As Boolean = value
    writer.WriteValue(If(boolVal, 1, 0))
End Sub

Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object
    Dim value = reader.Value
    If IsNothing(value) OrElse String.IsNullOrWhiteSpace(value.ToString()) OrElse "0" = value Then
        Return False
    End If
    If 0 = String.Compare("yes", value, True) OrElse 0 = String.Compare("true", value, True) Then
        Return True
    End If
    Return False
End Function

Public Overrides Function CanConvert(objectType As Type) As Boolean
    Return objectType = GetType(Boolean) OrElse objectType = GetType(Boolean?) 'OrElse objectType = GetType(String)
End Function
End Class

Я начал это на основе @John здесь:как получить newtonsoft для десериализации да и нет для логического

Ваш ответ на вопрос