JContainer、JObject、JTokenとLinqの混乱
質問
私は、どのような場合に
JContainer
,
JObject
そして
JToken
. 私は、"standards" から、次のように理解しました。
JObject
で構成されています。
JProperties
であり、その
JToken
は、すべての
JToken
の型のための基本抽象クラスですが、私は
JContainer
.
私はC#を使用しており、LinqPad Pro 5を購入したばかりです。
JSONのデータソースがファイルにあるので、そのファイルの中身をこのステートメントを使ってうまくデシリアライズしています。
string json;
using (StreamReader reader = new StreamReader(@"myjsonfile.json"))
{
json = reader.ReadToEnd();
}
この時点で、JSON文字列オブジェクトを取り出し、デシリアライズして
JObject
にデシリアライズします (これは私の間違いかもしれません。
jsonWork
a
JToken
または
JContainer
?):
JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);
私のJSONデータ(JSONで表現された文字列)には、3つのオブジェクトがあります--トップレベルのオブジェクトは、次のようなものです。
{
"Object1" : { ... },
"Object2" : { ... },
"Object3" : { ... }
}
各オブジェクトはあらゆる種類のトークン(配列、文字列、他のオブジェクトなど)で構成されており、動的なJSONになっています。(この質問を多くのJSONデータで混乱させるよりも、プレースホルダーとして省略形を使用しました)。
私は
"Object1"
,
"Object2"
そして
"Object3"
を別々にLINQで実行することができます。なので、理想はこんな感じです。
// these lines DO NOT work
var jsonObject1 = jsonWork.Children()["Object1"]
var jsonObject2 = jsonWork.Children()["Object2"]
var jsonObject3 = jsonWork.Children()["Object3"]
しかし、上記の行は失敗します。
私は
var
を使ったのは、どのようなオブジェクトタイプを使うべきか見当がつかないからです。
JContainer
,
JObject
または
JToken
! 一応、私がやりたいことは、一旦上記の
jsonObject#
変数が適切に割り当てられたら、LINQ を使ってそれらが含む JSON をクエリしたいと思います。以下は非常に簡単な例です。
var query = from p in jsonObject1
where p.Name == "Name1"
select p
もちろん、私のLINQは最終的にJSONの配列、オブジェクト、文字列などをフィルタリングするために
jsonObject
変数にあるJSON配列をフィルタリングします。一度、LinqPadを使って、LINQを使ったJSONのフィルタリングを手助けしてもらおうと思っています。
を使えばいいことを発見しました。
// this line WORKS
var jsonObject1 = ((JObject)jsonWork).["Object1"];
それから
JObject
の中に
jsonObject1
. これは正しいアプローチなのでしょうか?
私には、いつ/なぜ
JContainer
を使うのかが不明です。
JToken
と
JObject
オブジェクトはLINQで非常にうまく動作します。の目的は何でしょうか?
JContainer
?
どのように解決するのですか?
JContainer
は、子項目を持つJSON要素の基底クラスです。
JObject
,
JArray
,
JProperty
と
JConstructor
はすべてこれを継承しています。
例えば、次のようなコードです。
(JObject)JsonConvert.DeserializeObject("[1, 2, 3]")
を投げます。
InvalidCastException
を投げますが、これを
JContainer
にキャストすれば、問題ないでしょう。
最初の質問についてですが、トップレベルにJSONオブジェクトがあることが分かっている場合は、そのまま使えます。
var jsonWork = JObject.Parse(json);
var jsonObject1 = jsonWork["Object1"];
関連
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み] LINQで複数の "order by "を使用する
-
[解決済み] SelectとSelectManyの違い
-
[解決済み] LINQのGroup by
-
[解決済み] DataTableに対するLINQクエリ
-
[解決済み] LINQで.Firstと.FirstOrDefaultを使用するタイミングは?
-
[解決済み] ASP.NETでJSONを単純なDictionary<string,string>にデシリアライズするにはどうすればよいですか?
-
[解決済み] バイナリデータをJSON文字列で。Base64より優れたもの
-
[解決済み] JSONでnullを表現する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】Nullableオブジェクトは値を持たなければならない?