2

ばかげた質問かもしれませんが、申し訳ありません...

私は次のJSONを持っています(明らかに単純化されています) :

{
   "rgDescriptions":{
      "32895951_0":{
         "id":"32895951",
         "名前":"猫",
      }、
      "61694787_0":{
         "id":"61694787",
         "名前":"犬",
      }
   }
}

私の問題の簡単な例として、これは機能します:

jsonObject["rgDescriptions"]["32895951_0"]["name"]

しかし、これはしません:

jsonObject["rgDescriptions"].First()["name"]
//InvalidOperationException:  Cannot access child value on Newtonsoft.Json.Linq.JProperty.

それを機能させるには、次のように変更する必要があります。

jsonObject["rgDescriptions"].First().First()["name"]

の最初のオブジェクトjsonObject["rgDescriptions"]は と同等でなければならないので、それは私には意味がありません["32895951_0"][]演算子と両方ともJToken を返すため、なぜ機能しないのか、またはそれが実際に何を表しているのかが.First()よくわかりません。["rgDescriptions"].First()

何が起こっているのか誰か説明してくれませんか?

4

1 に答える 1

3

最初に、 a とは何か、および含まれている可能性があるものを確認すると役立つ場合がありますJToken

  • JTokenJObjectJPropertyJArrayおよびの抽象基本クラスですJValue。これらはすべて、JSON に表示できる構造を表しています。
  • AJObjectJPropertyオブジェクトのコレクションです。他のものを含めることはできません。
  • AJPropertyは基本的にキーと値のペアです。Name文字列である a と、ではないValue別の a があります。JTokenJProperty

これを念頭に置いて、質問に答えることができます。

JObject["key"]指定されたキーで を検索し、JPropertyの一部であるJObjectを返します(キーが見つからない場合は null)。JTokenValueJProperty

JToken.First指定された の最初の子を返しますJToken。a のJObject場合、最初の子はJProperty(ValueのではなくJProperty) です。の場合JProperty、最初の (そして唯一の) 子は のValueですJProperty

なぜ彼らは同じように機能しないのですか?

メソッドが値ではなく JObject["key"]a を返した場合、. 代わりに、より面倒な構文を使用する必要があります。JPropertyjsonObject["key1"]["key2"]["key3"]jsonObject["key1"].Value["key2"].Value["key3"]

逆に、JToken.First常に a の が返されたValue場合、それを使用して の を検出するJPropertyことはできません。(この方法を使用している場合は、プロパティの名前をまだ知らないと思われますが、他の方法を使用している場合は知っています。) また、 、 などのナビゲーション プロパティは正しく機能しません。ヒエラルキーの間違ったレベルにいるからです。NameJPropertyNextPrev

于 2013-10-05T19:11:09.397 に答える