2016-11-16 18 views
1

第三者から以下のようなものが届いています。私がキーを知っているとき(例えばeasyField)、値を取得するのは簡単です。以下ではコンソールに書きます。しかし、第三者が私にランダムキーを使用するjsonを与えました。どのように私はそれにアクセスするのですか?json.netを使用してすべてのフィールドを取得するにはどうすればよいですか?

{ 
    var r = new Random(); 
    dynamic j = JsonConvert.DeserializeObject(string.Format(@"{{""{0}"":""hard"", ""easyField"":""yes""}}", r.Next())); 
    Console.WriteLine("{0}", j["easyField"]); 
    return; 
} 
+0

をあなたはdotnetfiddle上の例を提供することができますか? – aloisdg

+1

@aloisdg https://dotnetfiddle.net/lWB4pv –

+0

mcve btwありがとうございます。 :) – aloisdg

答えて

2

JSON.NETで反射を使用することができます。それはあなたのフィールドのキーを与えるでしょう。

オンラインそれを試してみてください。Demo

using System; 
using System.Collections.Generic; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 


public class Program 
{ 
    public IEnumerable<string> GetPropertyKeysForDynamic(dynamic jObject) 
    { 
     return jObject.ToObject<Dictionary<string, object>>().Keys; 
    } 

    public void Main() 
    { 
     var r = new Random(); 
     dynamic j = JsonConvert.DeserializeObject(string.Format(@"{{""{0}"":""hard"", ""easyField"":""yes""}}", r.Next())); 

     foreach(string property in GetPropertyKeysForDynamic(j)) 
     { 
      Console.WriteLine(property); 
      Console.WriteLine(j[property]); 
     } 
    } 
} 

編集:

でも簡単なソリューション:

using System; 
using System.Collections.Generic; 
using Newtonsoft.Json; 

public class Program 
{ 
    public void Main() 
    { 
     var r = new Random(); 
     dynamic j = JsonConvert.DeserializeObject(string.Format(@"{{""{0}"":""hard"", ""easyField"":""yes""}}", r.Next())); 

     foreach(var property in j.ToObject<Dictionary<string, object>>()) 
     { 
      Console.WriteLine(property.Key + " " + property.Value); 
     } 
    } 
} 
0

これは、私はクラスのフィールドと値を得るために、私のプロジェクトで使用されていたものです:私は!property.PropertyType.Namespace.StartsWith("System.Collections.Generic")をチェックしていた理由は、それが実体モデルでinfinteループを引き起こしていたように、その

public static List<KeyValuePair> ClassToList(this object o) 
{ 
    Type type = o.GetType(); 
    List<KeyValuePair> vals = new List<KeyValuePair>(); 
    foreach (PropertyInfo property in type.GetProperties()) 
    { 
     if (!property.PropertyType.Namespace.StartsWith("System.Collections.Generic")) 
     { 
       vals.Add(new KeyValuePair(property.Name,(property.GetValue(o, null) == null ? "" : property.GetValue(o, null).ToString())) 
     } 
    } 
    return sb.ToString(); 
} 

は注意してそうでない場合は、if条件を削除できます。

関連する問題