2017-05-04 2 views
0

현재 json 파일의 다른 배열 안에있는 배열에서 데이터를 가져 오려고합니다. 불행하게도 내가 LINQ 정말 지식이 아니에요 그래서 나는JSR.Net을 사용하여 JArray 내부에서 JArray를 파싱하십시오.

"Fruits": [ 
      { 
       "type": "banana", 
       "FunFact": [ 
       { 
        "$": "Yellow" 
       }, 
       { 
        "$": "Long" 
       }, 
       { 
        "$": "People love them" 
       } 
       ] 

      } 
     ] 

현재이 내 코드는 C#으로 JSON 파일의

샘플을 모두하고있는 중이 야.

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")에서, 루트 token에서 토큰 "FunFact"의 값을 가져오고 다음 JArray를 입력 변환하는 방법 JToken.Value<T>(Object key)를 사용하고 있다는 것입니다있다. 그러나 루트 토큰에 속하는 속성은 "FunFact"입니다. 대신이 csfdata[i]에 속하는, 그래서 당신은 할 필요가 : 내가 코드를 통해 알 수있는 방법,

var tfdata = csfdata[i].Value<JArray>("FunFact"); 

업데이트 나는 그것이 배열이나 객체인지 확인하려면

를?

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 
} 
: 대신 Type 속성을 확인,

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 
} 

또는 : JToken.Value<T>(Object key) 방법을 사용하지 않는 경우

, 그냥 직접 본 뒤 유형을 확인 item indexer를 사용하여 값을 가져 오기

JToken.Value<T>(Object key)은 값을 특정 유형으로 변환 할 수 있고 그렇지 않은 경우 예외가 발생하기를 원할 때 유용합니다.

+0

var tfdata = csfdata [i]. 값 ("FunFact"); 정답입니다. 정말 고맙습니다! 만약 내가 배열인지 객체인지를 알고 싶다면 코드를 통해 어떻게 알 수 있습니까? 이 경우 : (csfdata [i] .Value ("FactorText")가 (가) JArray 인 경우) JObject에서 JArray 로의 유효하지 않은 캐스트가 발생합니다. – JuniorFlip