C# 如何检查变量是数组还是对象?
为了反序列化json对象,我必须定义一个父类,该父类将包含子类的对象或对象数组。如果检索到一个对象,则它必须是一个对象;如果从json检索到一个数组,则它必须是一个对象数组 JSON数组对象C# 如何检查变量是数组还是对象?,c#,json,windows-phone-7,c#-4.0,C#,Json,Windows Phone 7,C# 4.0,为了反序列化json对象,我必须定义一个父类,该父类将包含子类的对象或对象数组。如果检索到一个对象,则它必须是一个对象;如果从json检索到一个数组,则它必须是一个对象数组 JSON数组对象 {"y":{"x":[{"data":28}, {"data":56}, {"data":89}]}} JSON对象 {"y":{"x":{"data":28}}} y一次接收x,x[]另一次接收。没有这样的条件来确定y是否接收数组或对象 因此,为了确定是否接收到数组,我检查IsArray()条件 我试
{"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; }
}
类Y中x类型的属性x不能是x的数组,如果您明确声明它是x类型的。将其声明为对象将是解决此问题的一种方法 如果您想检查它是否是一个数组,我会使用一个支持字段(比如x),然后在使用属性的地方进行检查(
typeof(x)==x[]
)
但这可能会变得混乱,我最好的建议是将属性x的类型设置为x[],并在集合中确定值是否是数组(如果是,则只设置\u x=value
),或者如果不向x的空数组添加值首先,数组是一个对象。这是一件好事,因为它允许这些函数工作(都假设使用System;
):
其次,如果希望属性的类型可以是X
或X[]
,则属性的类型必须是对象
:
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的数组。我一直在使用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;
希望这有帮助 你可以试试这个
if (obj.GetType().IsArray)
{
...
}
另一种方法是
if (obj is Array) {
...
}
您可以控制生成JSON的逻辑吗?如果是这样,你应该考虑重新设计数据对象遵循一个标准合同。拥有一个有时是单个对象,有时是数组的属性是一个糟糕的设计,从长远来看是有问题的。如果你有能力,你应该考虑把它做成一个数组,并建立你的对象模型来解释这个问题。检查
类型
。您应该在您感兴趣的对象上进行检查,而不是在系统上进行检查。
if (obj is Array) {
...
}