使用JSON.Net解析JArray内部的JArray

使用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)当您希望该值可转换为某种类型并希望抛出异常时非常有用,如果不是。

+0

var tfdata = csfdata [i] .Value (“FunFact”);是正确的答案。非常感谢!如果我想知道它是一个数组还是一个对象,后续bu的道歉,我怎么能通过代码来告诉。如果我这样做: if(csfdata [i] .Value (“FactorText”)is JArray) 我得到一个从JObject到JArray的无效转换 – JuniorFlip