[c#] JSON.NET:親(ホルダー)オブジェクトの値に基づいてインターフェースのプロパティを逆シリアル化する方法



Answers

Question

私はそのようなクラスを持っている

class Holder {
    public int ObjType { get; set; }
    public List<Base> Objects { get; set; }
}

abstract class Base {
    // ... doesn't matter
}

class DerivedType1 : Base {
    // ... doesn't matter
}

class DerivedType2 : Base {
    // ... doesn't matter
}

WebAPIを使用するオブジェクトHolderを受け取って、正しくデシリアライズする必要があります。 ObjType値に基づいて、 List<DerivedType1>ObjType == 1 )またはList<DerivedType2>ObjType == 2 )のいずれかにデシリアライズされるObjectsプロパティが必要です。

現時点で私はSOとインターネットを最善の方法で検索しましたが、私が見つけた最高のものはこの回答です。https://.com/a/8031283/1038496 このソリューションの問題点は、親オブジェクトのコンテキストが緩んでいるため、 ObjTypeの値がObjTypeません。 OK、 Holder用のカスタムJsonConverterを作成してObjType値を再作成することで解決できましたが、まだ私はこの行に敬意を表しています

serializer.Populate(jObject.CreateReader(), target);

この答えの下のコメントとして

ReadJsonメソッドで作成された新しいJsonReaderは、元のリーダーの構成値(Culture、DateParseHandling、DateTimeZoneHandling、FloatParseHandlingなど)を継承しません。 これらの値は、serializer.Populate()で新しいJsonReaderを使用する前にコピーする必要があります。

これは私にとって問題であり、これらの値を自分でコピーすることは私にはきれいに見えません。

だから問題は: 親のプロパティの値に基づいて抽象的なオブジェクトのプロパティをdeserializeしていない方が良いアプローチはありますか?




Links