5

私がデコードしようとしているクラスは文字列フィールドを使用し、Newtonsoft のデフォルト デコーダーは json ファイルのブール値を大文字の文字列に変換します。おそらく、「True」または「False」のいずれかになるブール型の ToString() を呼び出します。

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-booleans を「true」または「false」に変換するカスタム デコーダーが必要です。

どんな助けでも大歓迎です。

4

2 に答える 2

0
/// <summary>
/// Implements a <see cref="JsonStringBoolConverter"/> that will handle serialization of Json Boolean values to strings
///  with capital letter.
/// </summary>
/// <summary>
/// Starting from Newtonsoft.Json v9.0.1 default converting logic has been changed
/// Old logic: 
/// json boolean 'true' => .NET string "True"
/// 
/// New logic:
/// json boolean 'true' => .NET string "true"
/// 
/// Details: https://github.com/JamesNK/Newtonsoft.Json/issues/1019
/// </summary>
public sealed class JsonBooleanStringConverter : JsonConverter
{
    /// <summary>
    /// See <see cref="JsonConverter.CanConvert"/>.
    /// </summary>
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    /// <summary>
    /// Specifies that this converter will not participate in writting.
    /// </summary>
    public override bool CanWrite
    {
        get
        {
            return false;
        }
    }

    /// <summary>
    /// See <see cref="JsonConverter.ReadJson"/>. 
    /// </summary>
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        string str = token.Value<string>();

        if (token.Type == JTokenType.Boolean)
        {
            if (string.Equals("true", str, StringComparison.OrdinalIgnoreCase))
            {
                str = "True";
            }
            else if (string.Equals("false", str, StringComparison.OrdinalIgnoreCase))
            {
                str = "False";
            }
        }

        return str;
    }

    /// <summary>
    /// See <see cref="JsonConverter.WriteJson"/>.
    /// </summary>
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}
于 2016-10-18T08:52:42.983 に答える