2017-10-11 2 views
1

C#では、charインデックス位置からJSONPathを取得できますか?つまり、JSON文字列内にテキストカーソルを置き、その位置からJSONPathを知りたいと考えています。charインデックスからJSONPathを特定する

JObject o = JObject.Parse(@"{""items"":[{""item1"":""Something1""},{""item2"":""Something2""},{""item3"":""Something3""},{""item4"":""Something4""}]}}"); 

int charindex = 26; 
string jsonpath = o.GetToken(charindex); // imaginary method call 

jsonpath == "$.items[?(@.Item1 == 'Something1')]"; 

私は運が役に立たないように、ライブラリやコードスニペットを検索しました。最善のアプローチは何ですか?正規表現は適切でしょうか?

+0

それは正確に何をしたいではないのですが、 'JToken'は、明示的に[' IJsonLineInfo'](https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_IJsonLineInfo.htm)インタフェースを実装しています。 [parse](https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JToken_Parse_1.htm)ルート 'JToken'を[' new JsonLoadSettings {LineInfoHandling.Load} '](https:// www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_Linq_JsonLoadSettings_LineInfoHandling.htm)、各トークンはその行番号と文字列内の位置を記憶します。 – dbc

+0

そして、 'JToken'を指定すると、[' token.Path'](https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_Linq_JToken_Path.htm)でパスを取得できます。 – dbc

答えて

2

私はNewtonSoftのJsonTextReaderは、PathLineNumberLinePositionのプロパティを使用して、あなたに必要なものを与えることができると思います。

例えばこのコード:

var s = @" 
    { 
     ""obj"": { 
      ""foo"": ""bar"" 
     }, 
     ""arr"": [ 
      1, 
      2, 
      3 
     ] 
    } 
"; 
using(var sr = new System.IO.StringReader(s)) 
{ 
    var r = new Newtonsoft.Json.JsonTextReader(sr); 
    while (r.Read()) 
     Console.WriteLine(r.LineNumber + ":" + r.LinePosition + " : " + r.Path); 
} 

は、次の出力与える:

2:5 : 
3:14 : obj 
3:16 : obj 
4:18 : obj.foo 
4:24 : obj.foo 
5:9 : obj 
6:14 : arr 
6:16 : arr 
7:13 : arr[0] 
8:13 : arr[1] 
9:13 : arr[2] 
10:9 : arr 
11:5 : 

をしかし、あなたは本当に唯一のchar型のインデックスに仕事をしたい場合、あなたはすべての改行を置換したい場合がありますあなたのjson文字列の空白は空白に戻ります。したがって、すべてが1行になります。

文字列内の特定の場所のパスを取得するのは簡単です:

var charIndex = 48; 
var s = @" 
    { 
     ""obj"": { 
      ""foo"": ""bar"" 
     }, 
     ""arr"": [ 
      1, 
      2, 
      3 
     ] 
    } 
"; 
s = s.Replace("\n", " ").Replace("\r", " "); 
var path = ""; 
using(var sr = new System.IO.StringReader(s)) 
{ 
    var r = new Newtonsoft.Json.JsonTextReader(sr); 
    while (r.Read() && r.LinePosition <= charIndex) 
     path = r.Path; 
} 
Console.WriteLine(path); // obj.foo 
+0

素晴らしい答え、ありがとう!私は正しい方向に役立つプッシュを与えます。 – wonea

関連する問題