1. ホーム
  2. c#

[解決済み] JSON.NETにおけるデシリアライズのためのキャスティング・インターフェイス

2022-04-25 18:30:24

質問

私は、様々なウェブサイトからJSONオブジェクトを取り込み(情報のスクレイピングを考える)、それらをC#オブジェクトに変換するリーダーをセットアップしようとしています。 現在、デシリアライゼーション処理にJSON.NETを使用しています。 私が遭遇している問題は、クラス内のインターフェースレベルのプロパティを処理する方法を知らないということです。 だから、本質の何か。

public IThingy Thing

エラーを発生させます。

タイプ IThingy のインスタンスを作成できませんでした。タイプはインターフェースまたは抽象クラスであり、インスタンス化できません。

私が取り組んでいるコードは機密性が高く、ユニットテストが非常に重要なので、ThingyではなくIThingyであることが比較的重要なのです。 アトミックなテスト・スクリプトのためのオブジェクトのモッキングは、Thingyのような本格的なオブジェクトでは不可能である。 インターフェイスである必要があります。

JSON.NETのドキュメントをずっと熟読していたのですが、このサイトで見つけられたこの件に関する質問は、すべて1年以上前のものです。 何かいい方法はないでしょうか?

また、もしそれが重要なら、私のアプリは.NET 4.0で書かれています。

どのように解決するのですか?

SamualDavisが素晴らしい解決策を提供しました。 関連質問 ということで、ここにまとめておきます。

JSONストリームをインターフェイスプロパティを持つ具象クラスにデシリアライズする必要がある場合、次のようにします。 そのクラスのコンストラクタのパラメータとして具象クラスをインクルードしてください。 NewtonSoftのデシリアライザーは賢いので、プロパティをデシリアライズするためにそれらの具象クラスを使用する必要があることを理解します。

以下はその例である。

public class Visit : IVisit
{
    /// <summary>
    /// This constructor is required for the JSON deserializer to be able
    /// to identify concrete classes to use when deserializing the interface properties.
    /// </summary>
    public Visit(MyLocation location, Guest guest)
    {
        Location = location;
        Guest = guest;
    }
    public long VisitId { get; set; }
    public ILocation Location { get;  set; }
    public DateTime VisitDate { get; set; }
    public IGuest Guest { get; set; }
}