如何检查变量是否为Array或Object?

为了反序列化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()未被识别?

首先,数组一个对象。 这是一件好事,因为它允许这些function工作(假设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的数组。

我一直在使用Json.NET Nuget包,它非常容易使用:

  string jsonStr = "{'y':{'x':[{'data':28}, {'data':56}, {'data':89}]}}"; dynamic jobject = JsonConvert.DeserializeObject(jsonStr); bool isArray = jobject.yxType == JTokenType.Array; bool isObject = jobject.yxType == JTokenType.Object; 

希望这可以帮助!

类Y中类型X的属性x如果表达式为X类型,则不能是X的数组。将其声明为对象将是绕过此方法的一种方法。

如果你想检查它是一个数组,我会使用一个支持字段(比如_x),然后在你使用该属性的地方做一个检查( typeof(_x) == X[]

这可能会变得混乱,我最好的建议是将属性x的类型设置为X [],并在集合中确定值是否为数组(如果只是设置_x = value )或者如果没有为空数组添加值X的