2012-03-16 12 views
9

Szybkie pytanie:JSonNet logiczna serializacji

W JSONNet - jak mogę dostać bool true/false do serializacji jako bool 1/0

widzę, jak możemy obsłużyć wartości null i wszystko, co po prostu cant wydają się dowiedzieć się, jak to zrobić.

jest to możliwe?

Odpowiedz

15

można zaimplementować niestandardową konwertera tak:

[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

Cześć To tylko uchwyty jeśli wartość wynosi „1” co jeśli mijam 2 zamiast 1, Otrzymasz również konwertowane do fałszywego –

+0

kodu tylko tego co logika chcesz. Przykładowy kod powinien sprawić, że będzie oczywiste, jak wykonać to, o co prosisz. –

+0

Muszę zwrócić błąd stanu modelu w przypadku, gdy użytkownik przejdzie dwa. Jak sobie z tym poradzić? –

0

Oto moja wersja (VB), jeśli ktoś potrzebuje. Obsługuje również pustych 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 

zacząłem to na podstawie @John tutaj: how to get newtonsoft to deserialize yes and no to boolean

0

Zainspirowany this response in similar question może być rozwiązany jak poniżej.

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

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