JSonNet布尔序列化

快速提问:

在JSONNet中 – 如何将bool true / false序列化为bool 1/0

我可以看到我们如何处理空值,所有这些似乎无法找到如何做到这一点。

这可能吗?

您可以实现这样的自定义转换器:

[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(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); } } 

如果有人需要,这是我的版本(在vb中)。 它还处理可以为空的布尔值

 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 to boolean

受类似问题的这种反应的启发,可以解决如下问题。

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