Newtonsoft Json.NET カスタムJsonConverter
のWriteJson
メソッドで、デフォルトのオブジェクトのシリアル化動作を 内からアピールできますJsonConverter
か?
つまり、カスタム コンバーターが登録されていなかった場合に発生するシリアライゼーションを延期できますか?
詳細
与えられた価格クラス
public class Price
{
public string CurrencyCode;
public decimal Amount;
}
通常の Newtonsoft Json.NET の動作はPrice
、参照が null の場合にのみ、インスタンスを null としてシリアル化することです。Price
さらに、ゼロになるたびにインスタンスを null としてシリアライズしたいと考えていPrice.Amount
ます。これが私がこれまでに取り組んできたことです(完全なソースコード)
public class PriceConverter : JsonConverter
{
// ...
public override void WriteJson(
JsonWriter writer,
object value,
JsonSerializer serializer)
{
var price = (Price)value;
if (0 == price.Amount) {
writer.WriteNull();
return;
}
// I'd like to replace the rest of this method with an appeal to the
// default serialization behavior.
writer.WriteStartObject();
writer.WritePropertyName("amount");
writer.WriteValue(price.Amount);
writer.WritePropertyName("currencyCode");
writer.WriteValue(price.CurrencyCode);
writer.WriteEndObject();
}
// ...
}
この実装の最後の部分は脆弱です。たとえば、 にフィールドを追加するPrice
と、シリアライゼーションが壊れてしまいます (そして、壊れたことを検出するテストを作成する良い方法がわかりません)。
私のシリアライザーには、保持する必要があるJsonSerializerSettingsを介して別のアセンブリで構成された多くの動作があります(キャメルケースのプロパティ名など)。これら 2 つの間に直接的な依存関係を追加することはできません。実際には、[JsonConverter(typeof(PriceConverter))]
属性を使用して、カスタム コンバーターを に使用する必要があることを指定していますPrice
。