2012-06-26 3 views
13

FacebookとTwitterの両方の情報を保持する単一のデータクラスを作成しようとしています。複数のJsonPropertiesを割り当てますか?

しかし、twitterからの私のJSON回答では、id_strが必要であり、FaceBookから私はidが得られます。

id -stringに入力する2つが必要です。

これで、をデシリアライズしてid -stringにする場合は、[JsonProperty("id_str")]を使用できることがわかりました。

しかし、FacebookのidとTwittersの両方をデシリアライズする必要がある場合は、id -stringにデータスクラップを追加しましたか?

答えて

7

いいえ、これはできません。

Json.NET documentationを見てみましょう。特に、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の/ ... speficic種類を - >あなたのタイプ

あなたが直接あなたの「一般的なタイプ」にデータをデシリアライズしようとした場合、あなたはちょうど彼らが整列しないので、苦労し維持するつもりされています100%を受信データと一緒に使用すると、デシリアリゼーションロジックを維持するのが難しい、ファンキーなものに巻き込まれます。

独自のカスタム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()); 

とにかく私は逆シリアル化のロジック自体を使用して、クラスの種類を汚染を避けるためにしようとするだろう。

+0

を使用することができますそれらのいずれか1つをチェックし、ヌルでないものを使用します。とにかくおかげさまで、他に何かを考え出す必要があります。どうもありがとう! :) –

+0

私は最後のオプションがむしろうまくいくはずだと思います。 – JefClaes

9

私は

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

    public string id { get; set; } 

は単に両方を添加し、1を作った、他の設定.....可能最も簡単な方法でそれを解決し...それがうまくいくと思う:P 時々簡単な解決策は最高です?

+2

動作しますが、すべての種類のプロパティで種類が汚染されます。デシリアライズしたJSONに応じて半分は使用されません。 –

+0

確かにそれをやる前に私の理論をテストできるようになるでしょう:) –

+0

Bingo !!!!!いくつかの単純なケースでは、これが最善の解決策です –

1

一般的なクラスモデルを使用するには、次のようにします。 Facebookのために

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; } 
} 

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

FOTツイッター、

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

、あなたはモデルクラスが使用されているものを忘れて、そしてただまあ、私はそれを望んでいたGenericClass

関連する問題