2017-07-17 10 views
0

私は受け取るJSONデータを格納するオブジェクトを作成していますが、オブジェクトを構造化する正しい方法を理解できません。基本的には、私は体の違いだけを持つ2つの異なるオブジェクトを受け取ることができるので、私は基本クラスを作りたいと思っています。JSONデータの基本クラス

public class SampleBase 
{ 
    public string url { get; set; } 
    public string resource { get; set; } 
    public string Body body { get; set; } 
} 

これは

public abstract class Body{ } 

の下に宣言したボディオブジェクトと私はその後、以下の例で私が受け取ることができ、ベースオブジェクトのバージョンのための2つの別々のファイルを、持っている、ベースの例です。

public class SampleObject : SampleBase 
{ 
    public class Body 
    { 
     public string bodyproperty { get; set; } 
    } 
} 

いくつかのプロパティを共有しているので、クラスを効率的にするためにこれをやっています。 SampleBaseクラスは決して呼び出されません。代わりに、着信jsonはSampleObjectに逆シリアル化されます。これはベストプラクティスですか?

編集:シリアライザのあなたの選択に依存して大きくすることができます。この例で行く、JSONは

{ 
    "url": "xxxxxxxxxx", 
    "resource": "xxxxxxx", 
    "body": { 
    "bodyproperty": "xxxx", 
      } 
} 
+1

これは、JSONの例を参照するのに役立つだろう、プラスなぜBodyプロパティは一例にしていないサンプルJSONと 'SampleClass' – maccettura

+0

@maccettura更新ポストでabstract''マークされています。 2つの異なる派生オブジェクトはボディに異なるプロパティを持つため、ボディオブジェクトのプロパティは抽象クラスとして宣言され、その代わりに派生オブジェクトに応じて設定されるため、基底オブジェクトには抽象クラスとしてマークされています –

答えて

0

あなたのクラス構造として受信されます。例えば、DataContractJsonSerializerは、継承されたクラスを技術的に扱うことができますが、ややこしい方法で行います。ベースタイプのすべての既知の継承者を基底タイプに定義する必要があります。

個人的には、あなたのケースでは継承よりも構図を使用します。そして、あなたが他の一般的なようなクラスを使用したい

[DataContract] 
public class Wrapper<T> where T : Body 
{ 
    [DataMember(Name = "url")] 
    public string Url { get; set; } 

    [DataMember(Name = "resource")] 
    public string Resource { get; set; } 

    [DataMember(Name = "body")] 
    public string T Body { get; set; } 
} 

[DataContract] 
public class Body 
{ 
    [DataMember(Name = "bodyproperty")] 
    public string BodyProperty { get; set; } 
} 

:ここDataContractJsonSerializerを使った例です。

Wrapper<Body> obj = new Wrapper<Body>(); 

編集:これはMVCアプリケーションであるので、あなたはおそらくJavascriptSerializerと仕事ができるでしょう。 DataContractDataMemberは無視できますが、クラスの構造は依然として関連しています。

var serializer = new JavaScriptSerializer(); 
var data = serializer.Deserialize<Wrapper<Body>>(json); 
+0

JSONは[HttpPost]で装飾されているMVCコントローラです。そのため、単純にオブジェクトのメソッドにパラメータを追加して、それをデシリアライズします –

関連する問題