2016-11-21 3 views
1

JSONをcsvに解析しています。次のように私は私のクラスを設定している。その後、C#JSON.netのヌルネストされたオブジェクト

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'が発生しました。....."上記の行にタグを付けます。私はそれがほとんどの時間、 "プロパティ"キーがnullであると信じています。実際には、ネストされているにもかかわらず、 "properites"キーはキーとして "__cloudera_internal__hueLink"の単一のキー:値のペアと値としてhtmlアドレス(本質的にテキスト)を持っています。

問題のない別のJSONスキーマセットでこのコードを正常に実行しましたが、私の人生では、基本的にキー/値のペアを「プロパティ」などのように設定する方法はわかりません。 "または" properties .__ cloudera_internal__hueLink ":"値フィールド "。以前は入れ子になっていたjsonオブジェクトには、エントリーからエントリーまでさまざまでしたが、常にその中に何かがありました。

あなたはたぶん新人レベルで助けを必要とするでしょう、私は利用可能なすべてのものとしてC#のみを使用していますが、明らかにJSONオブジェクトを扱うことについてはここに沿って1つか2つを選んでいますが、これは私はかなり難しい立ち往生している

Iエラーまたは「プロパティ」すべてに移入されませんを取得し、スローキーが見つからないエラー

+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

関連する問題