[.NET C#] カスタム JsonConverterでnullエラーを回避する方法

2021年6月2日水曜日

C#

t f B! P L

はじめに

NewtonsoftでカスタムJsonConverterを作ったとき、ネストしたJSONノードのnull判定をしておかないとnull例外が発生する。

例えば、JSON→.NETオブジェクトに変換するReadJsonメソッドが次の実装のとき、与えるJSONオブジェクトnullの時(string)JValue.Load(reader);の行で例外が発生する。

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        var s = (string)JValue.Load(reader);
        if (s.StartsWith(Prefix))
            s = s.Substring(Prefix.Length);
        return s;
    }

このように、nullが入る可能性がある場合は対策をしておく必要がある。

サンプルコード

さっそく、null判定に対応したカスタムJsonConverterを作っていこう。

実装は簡単で、オブジェクトを変換する前にnull判定を入れればいいだけだ。

public class MyJsnnConverter : JsonConverter
{
 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var myClass = (MyClass)value;
        writer.WriteStartObject();
        if (myClass.StringValue != null 
            || (serializer.NullValueHandling != NullValueHandling.Ignore 
                && (serializer.DefaultValueHandling & DefaultValueHandling.Ignore) != DefaultValueHandling.Ignore))
        {
            writer.WritePropertyName("StringValue");
            if (myClass.StringValue == null)
                writer.WriteNull();
            else
                serializer.Serialize(writer, myClass.StringValue);
        }
        writer.WriteEndObject();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.TokenType == JsonToken.Null)
            return null;
        var s = (string)JValue.Load(reader);
        return s;
    }

    public override bool CanConvert(Type objectType) { return objectType == typeof(MyClass); }
}

[JsonConverter(typeof(MyClassConverter))]
public class MyClass
{
    public string StringValue { get; set; }
}
スポンサーリンク

QooQ