2012-04-12 10 views
8

jsonオブジェクトをデシリアライズするために、子クラスのオブジェクトまたはオブジェクトの配列を含む親クラスを定義する必要がありました。オブジェクトが取得された場合はオブジェクトでなければならず、配列がjsonから取得された場合はオブジェクトの配列でなければなりません。変数が配列かオブジェクトかをチェックする方法は?

JSON配列オブジェクト

{"y":{"x":[{"data":28}, {"data":56}, {"data":89}]}} 

JSONオブジェクト

{"y":{"x":{"data":28}}} 

yは別の時にX []時にXを受信し、そしてれます。 yが配列またはオブジェクトを受け取るかどうかを決定するための条件はありません。

私は配列を受け取ったかどうかを判断するために、私はIsArray()条件をチェックしています。

私はそれが働いてイマイチ

class Y 
{ 
    public X x { get { return System.IsArray() ? new X() : new x[] }; set; } 
} 

class X 
{ 
    public int data { get; set; } 
} 
  1. を試してみました。
  2. System.IsArray()が認識されていませんか?
+2

JSONを生成するロジックを制御できますか?その場合は、標準契約に従うようにデータオブジェクトを再設計することを検討する必要があります。単一のオブジェクトであり、時には配列であるプロパティを持つことは、設計上の問題であり、長期的には問題になります。あなたが能力を持っているならば、それを配列にすることと、それを考慮に入れてオブジェクトモデルを構築することだけを考慮する必要があります。 –

+0

[IsArray](http://msdn.microsoft.com/en-us/library/system.type.isarray.aspx)は、 'Type'をチェックします。 'System'ではなく、チェックしたいオブジェクトでチェックしてください。 – Default

答えて

12

まずオフ、アレイオブジェクトはです。

bool IsArray(object o) { return o is Array; } 
bool IsArray(object o) { return o.GetType().IsArray; } 

第二に、あなたはXまたはX[]のいずれかになりますそのタイププロパティをしたい場合は、プロパティのタイプはobjectする必要があります:それは、これらの機能は、(両方ともusing System;を想定)作業することができますので、それは、良いことだ

class Y    
{ 
    private object _x; 
    public object x { 
     get { return _x; } 
     set 
     { 
      if (value.GetType != typeof(X) && value.GetType != typeof(X[])) 
       throw new ArgumentException("value"); 
      _x = value; 
     } 
    } 
} 

これは、objectを使用しており、実行時に型をチェックするので、静的な型指定の利点を幾分無視します。値が1つしかない場合でも、プロパティを配列として定義する方がずっと簡単です。このような場合には、それは長さが、私はJson.NET Nugetパッケージを使用してきた、そしてで動作するように本当に簡単になっています。1.

1

Xクラスの明示的な状態であれば、XクラスのXプロパティのプロパティxをX型にすることはできません。これをオブジェクトとして宣言すると、これをラウンドする方法の1つになります。

あなたがそれを確認したい場合は、プロパティを使用し、その後、私はバッキングフィールドを使用する配列(たとえば_x)とはいえ乱雑得ることができるチェック(typeof(_x) == X[]

、私の最高のアドバイスを行いますされますX []にプロパティXの種類を設定し、セットに(これだけ_x = valueを設定した場合)の値がアレイであったかどうかを決定する又はさXの空の配列に値を追加しない場合

4

ある配列のようになります。

string jsonStr = "{'y':{'x':[{'data':28}, {'data':56}, {'data':89}]}}"; 
    dynamic jobject = JsonConvert.DeserializeObject(jsonStr); 

    bool isArray = jobject.y.x.Type == JTokenType.Array; 
    bool isObject = jobject.y.x.Type == JTokenType.Object; 

は、この情報がお役に立てば幸い!

関連する問題