我一直在尝试使用C#Linq JSON库创建嵌套数组。有什么原因为什么第一种方法不起作用,而后来的一种起作用。
using System;
using Newtonsoft.Json.Linq;
public class Program
{
public static void Main()
{
JObject jo = new JObject();
// Linq-way
jo.Add(new JProperty("Nested_failed", new JArray(
new JArray(
new JValue(0),
new JValue(false),
new JValue(21)
)
)
)
);
// Second try
JArray nested = new JArray();
nested.Add(new JArray(
new JValue(0),
new JValue(false),
new JValue(21)
)
);
jo.Add(new JProperty("Nested_succeed",nested));
Console.WriteLine(jo.ToString());
}
}
结果
{
"Nested_failed": [
0,
false,
21
],
"Nested_succeed": [
[
0,
false,
21
]
]
}
据我了解,两种方法最终都将获得相同的结果。但是由于某些原因,在“ Linq-way”中构造嵌套JArray时会跳过它。
答案 0 :(得分:3)
这归结于“ JArray”的构造函数。
// Linq-way
jo.Add(new JProperty("Nested_failed", new JArray(
new JArray(
new JValue(0),
new JValue(false),
new JValue(21)
)
)
)
);
在上面的第一个示例中,您是从现有的JArray
创建一个JArray
。 documentation为在这种情况下选择的构造函数提供以下签名:
public JArray(JArray other)
在other
中,指出:
要复制的JArray对象。
因此,这将创建一个新的JArray
作为现有副本的副本。它不会创建嵌套数组。
JArray
上有other constructors确实创建了一个新的(JArray(Object content)
和JArray(params Object[] content)
),因此您可以强制代码使用上面提到的第二个构造函数通过向(object)
添加类型转换:
// Linq-way
jo.Add(new JProperty("Nested_failed", new JArray(
(object)new JArray(
new JValue(0),
new JValue(false),
new JValue(21)
)
)
)
);
答案 1 :(得分:3)
您应该稍微更新失败的部分,并将嵌套的JArray
传递给外部JArray
的集合初始化程序
jo.Add(new JProperty("Nested_failed",
new JArray
{
new JArray(new JValue(0), new JValue(false), new JValue(21))
}
));
JArray
ctor接受一个参数,该参数用于从中复制值,而不是将其添加为嵌套值
从另一个
JArray
初始化JArray
类的新实例 对象。参数
其他
类型:
Newtonsoft.Json.Linq.JArray
要复制的
JArray
对象。
添加集合初始值设定项后,您将获得以下输出,与第二次尝试相同
"Nested_failed": [
[
0,
false,
21
]
],
"Nested_succeed": [
[
0,
false,
21
]
]
}