2017-05-04 125 views
0

我目前正試圖從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; 

      } 

任何建議,不幸的是,我不能在此刻

回答

2

首先做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