2016-09-02 1 views
1

JSONオブジェクトの入力ストリームから最初のプロパティ名を読み取ろうとしていますが、その値に基づいて、「巻き戻し」してオブジェクト全体を読み取る可能性があります。JsonReaderを使用しているときに巻き戻しまたは後退する方法はありますか?

私は簡単に

JsonReader reader = ...; 
while (reader.Read()) { 
    if (reader.TokenType == JsonToken.PropertyName) { 
    // this is the first property 
    break; 
    } 
} 

のように最初のプロパティ名を読み取ることができますしかし、私はバックステップやリーダーを巻き戻すための任意の方法を見ることができません。

低レベルのシークが基本ストリームでサポートされていない可能性があることを理解していますが、すでに読んだJSONトークンを巻き戻して何らかの形で再解析することができます。

これが不可能な場合は、各プロパティの内容を解析せずにオブジェクトのプロパティ名のみを読み取る方法がありますか?私は1つのプロパティを調べるために2回だけ全体のものを読むのを避けたいと思います。

答えて

1

JsonReaderは、順方向読み取り専用です。最初から完全に再解析することなく、早期段階に「巻き戻し」する方法はありません。以前の情報を見ることができるようにしたいのであれば、それを読んで変数に格納する必要があります。

JsonReaderは、特定のトークンの子をスキップするために使用できるSkipメソッドを提供します。したがって、興味のないプロパティの名前を読み、次のトークンがオブジェクトまたは配列の開始点である場合は、Skipを使用して、そのオブジェクトまたは配列の最後のトークンに直接移動できます。

以下は、この手法を使用してJSONオブジェクトのルートプロパティ名だけを読み込み、すべての値をスキップする簡単な例です。

string json = @" 
{ 
    ""resultCode"": 200, 
    ""message"": ""OK"", 
    ""searchTerms"": [ 
    { 
     ""attribute"": ""keywords"", 
     ""operator"": ""contains"", 
     ""values"": [ ""ipsum"" ] 
    } 
    ], 
    ""count"": 2, 
    ""items"": [ 
    { 
     ""id"": 1, 
     ""name"": ""foo"", 
     ""sizes"": [ ""small"", ""meduim"", ""large"" ], 
     ""description"": ""Lorem ipsum dolor sit amet"" 
    }, 
    { 
     ""id"": 2, 
     ""name"": ""bar"", 
     ""sizes"": [ ""tiny"", ""huge"" ], 
     ""description"": ""Neque porro quisquam est qui dolorem ipsum"" 
    } 
    ] 
}"; 

using (StringReader sr = new StringReader(json)) 
using (JsonTextReader reader = new JsonTextReader(sr)) 
{ 
    while (reader.Read()) 
    { 
     if (reader.TokenType == JsonToken.PropertyName) 
     { 
      string propName = (string)reader.Value; 
      Console.WriteLine(propName); 

      // advance to property value 
      reader.Read(); 

      // if the value is an object or array, skip over its children 
      if (reader.TokenType == JsonToken.StartObject || 
       reader.TokenType == JsonToken.StartArray) 
       reader.Skip(); 
     } 
    } 
} 

出力:

resultCode 
message 
searchTerms 
count 
items 

フィドル:https://dotnetfiddle.net/qfejWk

関連する問題