Как преобразовать логические значения в декодированном json-файле в строки нижнего регистра?

Класс, который я декодирую, использует строковые поля, а декодер Newtonsoft по умолчанию преобразует логические значения в json-файле в строки в верхнем регистре. Вероятно, он вызывает ToString() логического типа, что приводит либо к "True", либо к "False".

void Main()
{
    var foo = JsonConvert.DeserializeObject<Foo>("{Prop:true}");
    Console.WriteLine(foo.Prop); // output: True, desired output: true
}

public class Foo
{
    public string Prop{get;set;}
}

Поскольку поле может быть либо строковым, либо логическим значением в json, мне нравится иметь собственный декодер, который всегда преобразует логические значения json в «true» или «false» в зависимости от значения.

Любая помощь будет оценена по достоинству.


person Patrik Meijer    schedule 17.10.2013    source источник


Ответы (1)


Как насчет такого:

class BoolStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (typeof(string) == objectType);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        string str = token.Value<string>();
        if (string.Equals("true", str, StringComparison.OrdinalIgnoreCase) ||
            string.Equals("false", str, StringComparison.OrdinalIgnoreCase))
        {
            str = str.ToLower();
        }
        return str;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Демо:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        { 
            ""Bool1"": true, 
            ""Bool2"": ""TRUE"", 
            ""Bool3"": false, 
            ""Bool4"": ""FALSE"",
            ""Other"": ""Say It Isn't True!"" 
        }";

        Foo foo = JsonConvert.DeserializeObject<Foo>(json, new BoolStringConverter());

        Console.WriteLine("Bool1: " + foo.Bool1);
        Console.WriteLine("Bool2: " + foo.Bool2);
        Console.WriteLine("Bool3: " + foo.Bool3);
        Console.WriteLine("Bool4: " + foo.Bool4);
        Console.WriteLine("Other: " + foo.Other);
    }
}

class Foo
{
    public string Bool1 { get; set; }
    public string Bool2 { get; set; }
    public string Bool3 { get; set; }
    public string Bool4 { get; set; }
    public string Other { get; set; }
}

Выход:

Bool1: true
Bool2: true
Bool3: false
Bool4: false
Other: Say It Isn't True!
person Brian Rogers    schedule 18.10.2013
comment
Я бы добавил следующее, чтобы вы могли использовать его в качестве атрибута: public override void WriteJson (JsonWriter Writer, значение объекта, сериализатор JsonSerializer) { Writer.WriteValue (value.ToString()); } - person PmanAce; 04.08.2016