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

anu*_*rag 10 c# json windows-phone-7 c#-4.0

为了反序列化json对象,我必须定义一个父类,它将包含子类的对象或对象数组.如果检索到对象,则必须是对象;如果从json检索到数组,则必须是对象数组.

JSON数组对象

{"y":{"x":[{"data":28}, {"data":56}, {"data":89}]}}
Run Code Online (Sandbox Code Playgroud)

JSON对象

{"y":{"x":{"data":28}}}
Run Code Online (Sandbox Code Playgroud)

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; }
}
Run Code Online (Sandbox Code Playgroud)
  1. 它不起作用.
  2. System.IsArray()未被识别?

pho*_*oog 13

首先,数组一个对象.这是一件好事,因为它允许这些功能工作(两者都假设using System;):

bool IsArray(object o) { return o is Array; }
bool IsArray(object o) { return o.GetType().IsArray; }
Run Code Online (Sandbox Code Playgroud)

第二,如果你想,它的类型可以是一个属性X或者X[],属性的类型必须是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;
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

这有点忽略了静态类型的优点,因为您object在运行时使用和检查类型.将属性定义为数组实际上要简单得多,即使对于只有一个值的情况也是如此.在这种情况下,它将是一个长度为1的数组.


Bra*_*ber 5

我一直在使用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;
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!