使用JSON.Net解析JArray内部的JArray
问题描述:
我目前正试图从json文件中另一个数组内的数组中获取数据。可惜我不是在LINQ真正懂行的,所以我做的这一切在C#JSON文件的使用JSON.Net解析JArray内部的JArray
样品
"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,两个先决问题:
- 你JSON是无效的,它缺少外花括号
{
和}
。没有外括号Json.NET不会解析你的JSON。 - JSON中的根属性名为
"Fruits"
,但在代码中使用属性名称"Fruit"
。这些需要匹配。
我怀疑这两个问题都是问题中的拼写错误。
假设这些初步的问题都解决了,你的问题是,在表达token.Value<JArray>("FunFact")
,您使用的方法JToken.Value<T>(Object key)
从根token
取令牌"FunFact"
的值,然后将其转换为键入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)
当您希望该值可转换为某种类型并希望抛出异常时非常有用,如果不是。
var tfdata = csfdata [i] .Value(“FunFact”);是正确的答案。非常感谢!如果我想知道它是一个数组还是一个对象,后续bu的道歉,我怎么能通过代码来告诉。如果我这样做: if(csfdata [i] .Value (“FactorText”)is JArray) 我得到一个从JObject到JArray的无效转换 –
JuniorFlip