2016-11-21 4 views
1

Я разбираю некоторые JSON в csv. У меня есть установки класса следующим образом:C# JSON.net null вложенные объекты

public class SearchObj 
{ 
    public class Property 
    {   
     public string __cloudera_internal__hueLink { get; set; } 
    } 
    public class root 
    { 
     public string blockSize { get; set; } 
     public string clusteredByColNames { get; set; } 
     public string compressed { get; set; } 
     public string created { get; set; } 
     public string dataType { get; set; } 
     public string deleted { get; set; } 
     public Property properties { get; set; } 
    } 
} 

затем позже я работаю с этим объектом:

string json = infile.ReadToEnd(); 
var rootObject = JsonConvert.DeserializeObject<List<SearchObj.root>>(json); 
for (int i = 0; i < rootObject.Count; i++) 
{ 
    //holding is a dict that holds json key/value pairs, 
    //arg[1] is a prefix for key:value pairs, in this case, no prefix 
    //so a nested key goes into dictionary as key.nestedkey 
    ResolveTypeAndValue(rootObject[i], "", holding); 
} 

И, конечно, мы должны увидеть код для метода Resolve:

private static void ResolveTypeAndValue(object obj, string name, Dictionary<string, string> storage) 
{ 
    //this next line is the error problem 
    var type = obj.GetType(); 
    foreach (var p in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) 
    { 
     if (p.PropertyType.IsClass && p.PropertyType != typeof(string)) 
     { 
      var currentObj = p.GetValue(obj); 
      ResolveTypeAndValue(currentObj, p.Name + ".", storage); 
     } 
     else 
     { 
      string val = ""; 
      if (p.GetValue(obj) != null) 
      { 
       val = p.GetValue(obj).ToString(); 
      } 
      storage.Add(name + p.Name, val); 
     } 
    } 
} 

Так что, когда я запускаю это, я получаю «Необработанное исключение типа« Исправление System.NullReferenceException », произошедшее в .....», помеченное указанной строкой. Я считаю, что это происходит потому, что большую часть времени ключ «свойства» равен нулю. На самом деле ключ «properites», несмотря на то, что он вложен, имеет только пару ключей: значение «__cloudera_internal__hueLink» в качестве ключа и html-адрес (по существу, текст) в качестве значения.

Я успешно выполнил этот код на другом наборе схемы JSON без проблем - но для жизни я не могу понять, как в принципе установить пару ключ/значение на что-то вроде «свойств»: «null "или" properties .__ cloudera_internal__hueLink ":" поле значений ". ранее вложенный объект json всегда имел что-то в нем, даже если он варьировался от входа к записи.

Возможно, вам понадобится помощь на уровне новичков, я использую только C# на работе, так как это все, что у меня есть, но, очевидно, я взял кое-что здесь в SO о работе с объектами JSON , но это один имеет меня застрял довольно трудно

я либо получить ошибки или «свойство» не заполняются на все и бросает ключ не найдена ошибка

+1

Можете ли вы предоставить некоторые из JSON? – Kamen

ответ

0

Изменения ResolveTypeAndValue функции этого:

private static void ResolveTypeAndValue(object obj, string name, Dictionary<string, string> storage) 
{ 
    if (obj == null) 
    { 
     storage.Add(name, null); 
     return; 
    } 

    var type = obj.GetType(); 
    foreach (var p in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)) 
    { 
     if (p.PropertyType.IsClass && p.PropertyType != typeof(string)) 
     { 
      var currentObj = p.GetValue(obj); 
      ResolveTypeAndValue(currentObj, p.Name, storage); // removed this: '+ "."' 
     } 
     else 
     { 
      string val = ""; 
      if (p.GetValue(obj) != null) 
      { 
       val = p.GetValue(obj).ToString(); 
      } 
      storage.Add(name + "." + p.Name, val); // added this: '+ "."' 
     } 
    } 
} 
+1

omg Я хочу сам погладить. Это был ответ. Я должен был настроить storage.Add() из-за соединения в методах, но это было именно так. Ответ принят, и яйцо на моем лице для такого простого исправления. 'storage.Add (" Свойства .__ cloudera_internal__hueLink "," ")' – RDS

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