2013-02-11 2 views
1

У меня есть набор данных в JSON и с использованием библиотеки C# JSON.net. Я пытаюсь прочитать данные как конкатенированную строку, но у вас проблемы с извлечением данных. Данные имеют корневой элемент, затем строки. Для каждой строки в «строках» я хочу вывести список значений ["conversionPathValue"] ["nodeValue"] и объединить их вместе, а затем объединить их с значениями primitiveValue. Пример кода из 2-х строк ниже:Прочитайте JSON с помощью JSON.net C# с вложенными массивами

 "rows": [ 
     [ 
      { 
      "conversionPathValue": [ 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       } 
      ] 
      }, 
      { 
      "primitiveValue": "20130122" 
      }, 
      { 
      "primitiveValue": "000" 
      }, 
      { 
      "primitiveValue": "000001" 
      }, 
      { 
      "primitiveValue": "000" 
      }, 
      { 
      "primitiveValue": "11" 
      }, 
      { 
      "primitiveValue": "7290.521799" 
      } 
     ], 
     [ 
      { 
      "conversionPathValue": [ 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "MET" 
       }, 
       { 
       "nodeValue": "(none)" 
       }, 
       { 
       "nodeValue": "(none)" 
       }, 
       { 
       "interactionType": "CLICK", 
       "nodeValue": "organic" 
       } 
      ] 
      }, 
      { 
      "primitiveValue": "20130122" 
      }, 
      { 
      "primitiveValue": "000" 
      }, 
      { 
      "primitiveValue": "000011" 
      }, 
      { 
      "primitiveValue": "005" 
      }, 
      { 
      "primitiveValue": "1" 
      }, 
      { 
      "primitiveValue": "1628.0" 
      } 
     ], 
        .....etc........ 

, используя следующий код: (jsonExtract является JObject)

  var rows = jsonExtract["root"]["rows"][0].Children(); 

      foreach (JToken result in rows) 
      { 
       var primitiveValues = result["primitiveValue"].Values<string>(); 
       var pathValues = result["conversionPathValue"].Values<string>(); 

       string joinedprimitiveValues = string.Join(",", primitiveValues); 
       string joinedpathValues = string.Join("-", pathValues); 

       file2.WriteLine(joinedpathValues + ", " + joinedprimitiveValues); 

      } 

Это дает ошибку «объекта не задана ссылка на экземпляр объекта "при настройке primitiveValues.

Я знаю, что проблема, вероятно, связана с вложенными элементами, но я не знаю, как их обслуживать. Может ли кто-нибудь помочь, пожалуйста?

ответ

3

Я думаю, что проблема, с которой вы столкнулись в своем коде, заключалась в том, что вы не обрабатывали случай, когда primitiveValues или pathValues имеет значение NULL, которое из-за того, что вы обращаетесь к строкам, будет происходить на каждой итерации.

Е.Г., если это строка:

{ 
    "primitiveValue": "20130122" 
}, 

result["conversionPathValue"] Затем собирается вернуться null.

Попробуйте это:

var obj = JObject.Parse(json); 
var rows = obj["rows"].Children(); 

foreach (JToken row in rows) 
{ 
    List<string> conversionPaths = new List<string>(); 
    List<string> primitiveValues = new List<string>(); 

    foreach (JToken value in row.Children()) 
    { 
     var primitiveValue = value["primitiveValue"]; 

     if (primitiveValue != null) 
     { 
      primitiveValues.Add(primitiveValue.Value<string>()); 
     } 

     var conversionPathValue = value["conversionPathValue"]; 

     if (conversionPathValue != null) 
     { 
      var paths = conversionPathValue.Children() 
       .Where(t => t["nodeValue"] != null) 
       .Select(t => t["nodeValue"].Value<string>()); 

      conversionPaths.AddRange(paths); 
     } 
    } 

    Console.WriteLine("Primitive Values:"); 
    Console.WriteLine(string.Join(",", primitiveValues.ToArray())); 
    Console.WriteLine("Conversion Paths:"); 
    Console.WriteLine(string.Join(",", conversionPaths.ToArray()) + "\n"); 
} 

Когда я бегу, что на данном формате JSON, он производит следующие действия:

Primitive Values: 
20130122,000,000001,000,11,7290.521799 
Conversion Paths: 
MET 

Primitive Values: 
20130122,000,000011,005,1,1628.0 
Conversion Paths: 
MET,MET,MET,MET,MET,MET,MET,MET,(none),(none),organic 

Обратите внимание, что я добавил { и } вокруг JSON, чтобы заставить его работать ,

+0

Это раздувает меня по следующей строке: var primitiveValue = value ["primitiveValue"]; «Невозможно получить доступ к дочернему значению на Newtonsoft.Json.Linq.JProperty». – wloescher

+0

@wloescher Как выглядит JSON? Похоже, эта ошибка исходит от попытки доступа к ребенку, когда у вас есть свойство. –

+0

Я получаю ту же ошибку в том же месте –

Смежные вопросы