【问题标题】:How to check if a variable is Array or Object?如何检查变量是数组还是对象?
【发布时间】:2012-04-12 06:16:11
【问题描述】:

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

【问题讨论】:

  • 您是否可以控制生成 JSON 的逻辑?如果是这样,您应该考虑重新设计数据对象以遵循标准合同。从长远来看,拥有一个有时是单个对象、有时是数组的属性是一个糟糕的设计和问题。如果你有能力,你应该考虑把它变成一个数组并构建你的对象模型来解决这个问题。
  • IsArray 检查Type。你应该在你有兴趣检查的对象上检查它,而不是在System

标签: c# json windows-phone-7 c#-4.0


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我一直在使用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;
    

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      如果您明确声明它是 X 类型,则 Y 类中 X 类型的属性 x 不能是 X 的数组。将其声明为对象将是解决此问题的一种方法。

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

      虽然这可能会变得一团糟,但我最好的建议是将属性 x 的类型设置为 X[] 并在集合中确定该值是否为数组(如果是,则只需设置 _x = value)或者是否不添加值X 的空数组

      【讨论】:

        【解决方案4】:

        你可以试试这个……

        if (obj.GetType().IsArray)
        {
          ...
        }
        

        另一种方法是,

        if (obj is Array) {
           ...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-02-08
          • 2020-05-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多