14

FacebookとTwitterの両方からの情報を保持する単一のデータクラスを作成しようとしています。

しかし、TwitterからのJSON応答では、必要id_strであり、FaceBookから取得しidます。

idこれらの2つを-stringに入れる必要があります。

これで、 Twitterを文字列[JsonProperty("id_str")]に逆シリアル化する場合に使用できることがわかりました。id_strid

しかし、FacebookidとTwitterの両方を、データクラスにid_strある同じ文字列で逆シリアル化する必要がある場合はどうなりidますか?

4

3 に答える 3

9

私はそれを可能な限り最も簡単な方法で解決したと思います.....

    public string id_str { 
        get{return id;}
        set{id = id_str;}
    }

    public string id { get; set; }

両方を追加して一方を作成し、もう一方を設定するだけです。それは機能します:P単純なソリューションが最適な場合がありますか?

于 2012-06-26T09:22:48.837 に答える
8

いいえ、これは不可能です。

Json.NETのドキュメントを見てみましょう。特に、JsonPropertyAttributeクラスに関するヘルプページ。

引用するには:

「指定された名前のメンバーを常にシリアル化するようにJsonSerializerに指示します。」

Newtonsoft.Json名前空間で宣言されています。それがどのように宣言されるかを決定する必要があります。CodePlexでJson.NETのソースコードを見てみましょう。

http://json.codeplex.com/

[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property |     
 AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class JsonPropertyAttribute : Attribute
{
    //...
}

それが質問に答えると思います。属性のAllowMultipleプロパティがfalseに設定されています。したがって、この属性を使用してプロパティ、フィールド、またはパラメータを複数回装飾することはできません。

Json.netがどの属性を使用するかをどのように判断できると思いますか?受信したJSONデータを逆シリアル化できるTwitterとFacebookのタイプを別々に作成します。

それで:

Twitter -> JSON -> Twitter specific types
Facebook -> JSON -> Facebook spefic types

次に、これらのタイプに直接対処する代わりに、アプリケーションが使用する抽象化を作成します。それらは特定のソーシャルメディアの実装に属しているだけです。

Twitter / Facebook/...特定のタイプ->あなたのタイプ

データを「一般的なタイプ」に直接逆シリアル化しようとすると、受信したデータと100%整列しておらず、ファンキーで保守が難しい逆シリアル化ロジックが発生するため、苦労し続けることになります。 。

もう1つのオプションは、独自のカスタムJson.NETコンバーターを作成することです。

http://geekswithblogs.net/DavidHoerster/archive/2011/07/26/json.net-custom-convertersndasha-quick-tour.aspx

TwitterとFacebookのコンバーターを作成し、JSONデータを逆シリアル化するときに、使用するコンバーターを指定するだけです。

  • TwitterConverter
  • FacebookConverter

例えば:

MySocialType myType = JsonConvert.DeserializeObject<Mapped>(json, 
    new TwitterConverter());

とにかく、逆シリアル化ロジック自体でクラスタイプを汚染しないようにします。

于 2012-06-26T08:54:03.420 に答える
2

使用するジェネリッククラスモデルを探している場合は、次のように実行できます。

public class GenericClass
{
    public virtual string ID {get;set;}
}
public class FaceBook : GenericClass
{
    [JsonProperty("id")]
    public override string ID { get => base.ID; set => base.ID = value; }
}
public class Twitter : GenericClass
{
    [JsonProperty("id_str")]
    public override string ID { get => base.ID; set => base.ID = value; }
}

Facebookの場合、

GenericClass genericClass = JsonConvert.DeserializeObject<FaceBook>(json);

Fot Twitter、

GenericClass genericClass = JsonConvert.DeserializeObject<Twitter>(json);

使用されているモデルクラスを忘れて、GenericClassを使用するだけです。

于 2018-01-16T21:32:43.043 に答える