web-dev-qa-db-ja.com

事前にキーがわからない場合、C#でJSONオブジェクトを解析するにはどうすればよいですか?

次のようなJSONデータがあります。

{
  "910719": {
    "id": 910719,
    "type": "asdf",
    "ref_id": 7568
  },
  "910721": {
    "id": 910721,
    "type": "asdf",
    "ref_id": 7568
  },
  "910723": {
    "id": 910723,
    "type": "asdf",
    "ref_id": 7568
  }
}

JSON.netを使用してこれを解析するにはどうすればよいですか?私はこれを最初に行うことができます:

JObject jFoo = JObject.Parse(data);

このリストの各オブジェクトを反復処理できる必要があります。私はこのようなことができるようになりたいです:

foreach (string ref_id in (string)jFoo["ref_id"]) {...}

または

foreach (JToken t in jFoo.Descendants())
{
    Console.WriteLine((string)t["ref_id"]);
}

もちろん、それはうまくいきません。コードの記述中にキーを知っていれば、すべての例がうまく機能します。事前に鍵がわからないと故障します。

18
Nathan DeWitt

実行可能です。これは機能しますが、エレガントではありません。もっと良い方法があると確信しています。

var o = JObject.Parse(yourJsonString);

foreach (JToken child in o.Children())
{
    foreach (JToken grandChild in child)
    {
        foreach (JToken grandGrandChild in grandChild)
        {
            var property = grandGrandChild as JProperty;

            if (property != null)
            {
                Console.WriteLine(property.Name + ":" + property.Value);
            }
        }
    }
}

プリント:

id:910719 
 type:asdf 
 ref_id:7568 
 id:910721 
 type:asdf 
 ref_id:7568 
 id: 910723 
 type:asdf 
 ref_id:7568
21
TrueWill

私はJson.NETを使用しており、再帰的な方法を使用してすべてのキーと対応する値を出力できる簡単な方法を書きました。

      var o = JObject.Parse(YourJsonString);
      getAllProperties(o); //call our recursive method

次に、この再帰的メソッドを使用して、すべてのプロパティとその値を取得できます

   void getAllProperties(JToken children)
    {
        foreach (JToken child in children.Children())
        {
            var property = child as JProperty;
            if (property != null)
            {
                Console.WriteLine(property.Name + " " + property.Value);//print all of the values
            }
            getAllProperties(child);
        }
    }
3
MangoBoy

次のような簡単なLINQクエリを使用して、子孫を反復できます。

JObject jFoo = JObject.Parse(json);

foreach (JObject obj in jFoo.Properties().Select(p => p.Value))
{
    Console.WriteLine("id: " + obj["id"]);
    Console.WriteLine("ref_id: " + obj["ref_id"]);
}

同様に、ref_id値。次のようなものを取得できます。

foreach (string refId in jFoo.Properties().Select(p => p.Value["ref_id"]))
{
    Console.WriteLine(refId);
}
3
Brian Rogers

JavascriptSerializerの使用を検討しましたか?

あなたはこのようなことを試すことができます:

JavaScriptSerializer serializer = new JavaScriptSerializer();
var foo = serializer.Deserialize<Dictionary<string, Dictionary<string, string>>>(data);
foreach(var item in foo)
{
    Console.Writeln(item.Value["ref_id"]);
}

http://msdn.Microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx

1
Konstantin