为了反序列化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; }
}
答案 0 :(得分:13)
首先,数组是一个对象。这是一件好事,因为它允许这些功能起作用(都假定为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的数组。
答案 1 :(得分:4)
我一直在使用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;
希望这有帮助!
答案 2 :(得分:1)
类Y中类型X的属性x如果表达式为X类型,则不能是X的数组。将其声明为对象将是解决此问题的一种方法。
如果你想检查它是一个数组,我会使用一个支持字段(比如_x),然后在你使用该属性的地方做一个检查(typeof(_x) == X[]
)
这可能会变得混乱,我最好的建议是将属性x的类型设置为X [],并在集合中确定值是否为数组(如果是这样只设置_x = value
)或者如果不添加值为空数组X
答案 3 :(得分:0)
你可以试试这个...
if (obj.GetType().IsArray)
{
...
}
另一种方法是,
if (obj is Array) {
...
}