基本クラスのサブオブジェクトのリストを持つオブジェクトがあります。サブオブジェクトにはカスタム コンバーターが必要です。カスタム コンバーターでItemTypeNameHandling
オプションを尊重することはできません。
サンプル コード (新しい C# コンソール プロジェクトを作成し、JSON.NET NuGet パッケージを追加します):
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
namespace My {
class Program {
private static void Main () {
Console.WriteLine(JsonConvert.SerializeObject(
new Box { toys = { new Spintop(), new Ball() } },
Formatting.Indented));
Console.ReadKey();
}
}
[JsonObject] class Box
{
[JsonProperty (
ItemConverterType = typeof(ToyConverter),
ItemTypeNameHandling = TypeNameHandling.Auto)]
public List<Toy> toys = new List<Toy>();
}
[JsonObject] class Toy {}
[JsonObject] class Spintop : Toy {}
[JsonObject] class Ball : Toy {}
class ToyConverter : JsonConverter {
public override void WriteJson (JsonWriter writer, object value, JsonSerializer serializer) {
serializer.Serialize(writer, value);
}
public override object ReadJson (JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
return serializer.Deserialize(reader, objectType);
}
public override bool CanConvert (Type objectType) {
return typeof(Toy).IsAssignableFrom(objectType);
}
}
}
生成された出力:
{
"toys": [
{},
{}
]
}
必要な出力 (行にコメントを付けるとこうなりItemConverterType = typeof(ToyConverter),
ます):
{
"toys": [
{
"$type": "My.Spintop, Serialization"
},
{
"$type": "My.Ball, Serialization"
}
]
}
serializer.TypeNameHandling
inメソッドの値を一時的に変更してみましToyConverter.WriteJson
たが、無関係なプロパティに影響します。(もちろん、私の実際のコンバーターはそれよりも複雑です。これは基本的な機能を備えた単なる例です。)
質問:カスタム属性のプロパティをJsonConverter
尊重させるにはどうすればよいですか?ItemTypeNameHandling
JsonProperty