スポンサーリンク
はじめに
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; }
}
0 件のコメント:
コメントを投稿