2012-04-12 61 views
8

對於deserialising JSON對象,我不得不定義將包含一個或多個對象的爲子類陣列的父類。如果一個對象被檢索,它必須是一個對象,或者如果從json中檢索到一個數組,則它必須是一個對象數組。如何檢查變量是數組還是對象?

JSON陣列對象

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

JSON對象

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

Y在一次接收的x,而x []在另一時間。沒有這樣的條件來確定是否會收到一個數組或對象。

因此,用於確定是否我接收到的陣列或不,我檢查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邏輯控制?如果是這樣,您應該考慮重新設計數據對象以遵循標準合同。擁有一個屬性有時是一個單一的對象,有時是一個數組是一個糟糕的設計和長遠來看有問題。如果你有能力,你應該考慮把它作爲一個數組,並建立你的對象模型來解決這個問題。 – 2012-04-12 06:23:04

+0

[IsArray](http://msdn.microsoft.com/zh-cn/library/system.type.isarray.aspx)檢查「Type」。你應該檢查你感興趣的對象而不是'System'。 – Default 2012-04-12 06:23:33

回答

12

首先,數組的一個對象。這是一件好事,因爲它可以讓這些功能的工作(包括承擔using System;):

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

第二,如果你想要一個類型的屬性可以是XX[],屬性的類型必須是object

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

1

如果你明確聲明它是類型X,那麼類Y中的類型X的屬性x不能是X的數組。如果將它聲明爲對象,將是一種解決此問題的方法。

如果你要檢查它是一個數組,我會用一個支持字段(比如_x),然後在您使用屬性做一次檢查(typeof(_x) == X[]

這可能會導致混亂,雖然,我最好的建議是將屬性x的類型設置爲X [],並在集合中確定該值是否爲數組(如果是這樣設置,則只需設置_x = value),或者如果不將值添加到空數組X的數組中,則返回0

4

我一直在使用Json.NET NuGet包,它已經真正易於使用:

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; 

希望這有助於!

相關問題