我目前正在尝试从json文件中另一个数组内的数组中获取数据。不幸的是,我对LINQ并不是很了解,所以我在C#中做到了这一切
JSON文件示例
"Fruits": [
{
"type": "banana",
"FunFact": [
{
"$": "Yellow"
},
{
"$": "Long"
},
{
"$": "People love them"
}
]
}
]
目前这是我的代码。
var csfdata = token.Value<JArray>("Fruit");
//There are 8 of these Fruit Arrays
var csfcount = csfdata.Count;
Console.WriteLine("Length of CSFArray is {0}", csfcount.ToString());
for (int i = 0; i < csfcount; i++)
{
//Work just fine
Console.WriteLine("Fruit: {0}", token.SelectToken("Fruit[" + i.ToString() +"].type").ToString());
//Crashes here saying that FunFact is null or empty when I am trying to get a count of how many is in FunFact
var tfdata = token.Value<JArray>("FunFact");
var tfcount = tfdata.Count;
}
任何建议,遗憾的是我现在无法做LINQ
答案 0 :(得分:2)
首先,两个初步问题:
{
和}
。如果没有外括号,Json.NET将无法解析您的JSON。"Fruits"
,但在您的代码中使用属性名称"Fruit"
。这些需要匹配。我怀疑这两个问题都是问题中的拼写错误。
假设这些初步问题已得到解决,您的问题是,在表达式token.Value<JArray>("FunFact")
中,您正在使用方法JToken.Value<T>(Object key)
从根"FunFact"
获取令牌token
的值{ {1}}然后将其转换为JArray
类型。但是没有属性"FunFact"
属于根令牌。相反它属于csfdata[i]
,所以你需要这样做:
var tfdata = csfdata[i].Value<JArray>("FunFact");
<强>更新强>
我想知道它是一个数组还是一个对象,我怎么能通过代码来判断?
在这种情况下,请勿使用JToken.Value<T>(Object key)
方法,只需使用item indexer直接获取值,然后直接检查类型:
var tfdata = csfdata[i]["FunFact"];
if (tfdata is JArray)
{
var tfArray = (JArray)tfdata;
// Process the array
}
else if (tfdata is JObject)
{
var tfObj = (JObject)tfdata;
// Process the object
}
或者,请检查Type
属性:
var tfdata = csfdata[i]["FunFact"];
if (tfdata != null && tfdata.Type == JTokenType.Array)
{
var tfArray = (JArray)tfdata;
// Process the array
}
else if (tfdata != null && tfdata.Type == JTokenType.Object)
{
var tfObj = (JObject)tfdata;
// Process the object
}
当您期望值可以转换为某种类型并希望抛出异常时, JToken.Value<T>(Object key)
非常有用。