2012-03-16 2 views
9

Быстрый вопрос:JSonNet булево сериализации

В JSONNet - как я получаю BOOL истина/ложь для сериализации, как BOOL 1/0

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

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

ответ

15

Вы можете реализовать собственный конвертер, как это:

[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

Привет Он обрабатывает только если мое значение «1», что, если я прохожу 2 вместо 1, он будет также преобразуются в ложном –

+0

Просто код независимо от логики вы хотите. Пример кода должен сделать довольно очевидным, как делать то, что вы просите. –

+0

Я должен вернуть ошибку состояния модели в случае, если пользователь проходит два. Как обращаться с этим –

0

Вот мой вариант (в 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 здесь: how to get newtonsoft to deserialize yes and no to boolean

0

Вдохновленный this response in similar question может быть решена, как в следующем.

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

[JsonProperty(nameof(SomeFlag))] 
public int SomeFlagAsInt 
{ 
    get => IsOk ? 1 : 0; 
    set => IsOk = value > 0; 
} 
Смежные вопросы