2012-04-12 99 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; 

希望这有助于!