2016-11-21 1 views
1

Ich analysiere einige JSON zu CSV. Ich habe meine Klasse Setup wie folgt:C# JSON.net null verschachtelte Objekte

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; } 
    } 
} 

dann später ich mit diesem Objekt arbeiten:

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); 
} 

Und natürlich müssen wir den Code für die Resolve-Methode, um zu sehen:

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); 
     } 
    } 
} 

Also, wenn ich das ausführen, bekomme ich eine "Eine nicht behandelte Ausnahme vom Typ 'System.NullReferenceException' aufgetreten in ....." Tagging die obige Zeile. Ich glaube, das liegt daran, dass der Schlüssel "Eigenschaften" meistens Null ist. Tatsächlich hat der "properites" -Schlüssel, obwohl er verschachtelt ist, nur einen einzigen Schlüssel: Wertpaar des "__cloudera_internal__hueLink" als Schlüssel und eine HTML-Adresse (im Wesentlichen Text) als Wert.

Ich habe diesen Code erfolgreich auf einem anderen Satz von JSON-Schema ohne Probleme ausgeführt - aber für das Leben von mir kann ich nicht herausfinden, wie im Grunde das Schlüssel/Wert-Paar zu so etwas wie "Eigenschaften": "null "oder" Eigenschaften .__ cloudera_internal__hueLink ":" das Wertfeld ". vorher hatte das verschachtelte json-objekt immer etwas darin, auch wenn es von eingang zu eingang variierte.

Sie werden wahrscheinlich auf der Newcomer-Ebene helfen müssen, ich benutze nur C# bei der Arbeit, da alles verfügbar ist - aber offensichtlich habe ich hier ein paar Dinge über den Umgang mit JSON-Objekten gelesen , aber dieser hat steckte mich ziemlich hart

ich entweder die Fehler oder die „Eigenschaften“ erhalten, ist gar nicht aufgefüllt und wirft ein Schlüssel nicht Fehler

+1

Können Sie einige der JSON bereitstellen? – Kamen

Antwort

0

ändern der ResolveTypeAndValue Funktion dazu gefunden:

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 Ich möchte mich selbst stellen. Das war im Wesentlichen die Antwort. Ich musste die storage.Add() aufgrund der Verbindung in Methoden optimieren, aber das war es. Antwort angenommen und Ei ist auf meinem Gesicht für solch eine einfache Reparatur. 'storage.Add (" Eigenschaften .__ cloudera_internal__hueLink "," ")' – RDS

Verwandte Themen