Логическая сериализация 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);
 }
}
</bool>


Здесь моя версия (в vb), если кому-то это нужно. Он также обрабатывает нулевое значение Boolean

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 десериализовать yes и no для boolean


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

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

licensed under cc by-sa 3.0 with attribution.