如何检查变量是否为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; } }
- 它不起作用。
- System.IsArray()未被识别?
首先,数组是一个对象。 这是一件好事,因为它允许这些function工作(假设using System;
):
bool IsArray(object o) { return o is Array; } bool IsArray(object o) { return o.GetType().IsArray; }
其次,如果你想要一个类型可以是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; } } }
这有点忽略了静态类型的优点,因为您在运行时使用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的