JContainer
、JObject
、およびJToken
を使用するタイミングを理解できません。 「標準」から、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
をJToken
またはJContainer
にする必要があります)。
JObject jsonWork = (JObject)JsonConvert.DeserializeObject(json);
JSONデータ(JSONで表される文字列)には、3つのオブジェクトがあります。トップレベルのオブジェクトは次のようになります。
{
"Object1" : { ... },
"Object2" : { ... },
"Object3" : { ... }
}
各オブジェクトはあらゆる種類のトークン(配列、文字列、その他のオブジェクトなど)で構成されているため、動的JSONです。 (この質問を大量のJSONデータで埋め尽くすのではなく、楕円をプレースホルダーとして使用しました。)
ただし、LINQを使用して、"Object1"
、"Object2"
、および"Object3"
を個別に処理します。だから、理想的には、私はこのようなものが欲しいです:
// 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は最終的に、jsonObject
変数でJSON配列、オブジェクト、文字列などをフィルタリングします。いったん始めたら、LinqPadを使用して、LINQを使用してJSONをフィルター処理できると思います。
私が使用した場合:
// this line WORKS
var jsonObject1 = ((JObject)jsonWork).["Object1"];
次に、jsonObject1
でJObject
型を取得します。これは正しいアプローチですか?
JContainer
およびJToken
オブジェクトがLINQで非常にうまく機能しているように思えるときに、JObject
をいつ/なぜ使用するかはわかりません。 JContainer
の目的は何ですか?
JContainer
は、子アイテムを持つJSON要素の基本クラスです。 JObject
、JArray
、JProperty
およびJConstructor
はすべてそれを継承します。
たとえば、次のコード:
(JObject)JsonConvert.DeserializeObject("[1, 2, 3]")
InvalidCastException
をスローしますが、JContainer
にキャストする場合は問題ありません。
元の質問に関して、最上位にJSONオブジェクトがあることがわかっている場合は、次を使用できます。
var jsonWork = JObject.Parse(json);
var jsonObject1 = o["Object1"];
ほとんどの場合、JContainer
について心配する必要はありません。 LINQ-to-JSON を適切にファクタリングされたコードに整理および構造化するのに役立ちます。
JToken
階層は次のようになります。
JToken - abstract base class
JContainer - abstract base class of JTokens that can contain other JTokens
JArray - represents a JSON array (contains an ordered list of JTokens)
JObject - represents a JSON object (contains a collection of JProperties)
JProperty - represents a JSON property (a name/JToken pair inside a JObject)
JValue - represents a primitive JSON value (string, number, boolean, null)
JObject
isa JContainer
、whichisa JToken
.
基本的な経験則は次のとおりです。