2012-03-16 9 views
9

pregunta rápida:JSonNet serialización booleano

En JSONNet - ¿Cómo puedo obtener bool verdadero/falso para serializar como bool 1/0

puedo ver cómo manejamos los valores nulos y todo lo que no puede parecer a encuentra cómo hacer esto.

¿Esto es posible?

Respuesta

15

se puede implementar un convertidor de encargo de la siguiente manera:

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

Hola Sólo se maneja si mi valor es "1", lo que si paso 2 en lugar de 1, que va también se convierten en false –

+0

código sólo lo lógica que desea. El código de muestra debería hacer que sea bastante obvio cómo hacer lo que estás pidiendo. –

+0

Tengo que devolver un error de estado del modelo en caso de que el usuario pase dos. Cómo manejar eso –

0

aquí está mi versión (en VB) si alguien lo necesita. También maneja anulable booleana

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 

que comenzó esta basado en @John aquí: how to get newtonsoft to deserialize yes and no to boolean

0

Inspirado por this response in similar question se puede resolver como la siguiente.

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

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