私はNewtonSoftのJsonTextReader
は、Path
、LineNumber
、LinePosition
のプロパティを使用して、あなたに必要なものを与えることができると思います。
例えばこのコード:
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
それは正確に何をしたいではないのですが、 '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
そして、 'JToken'を指定すると、[' token.Path'](https://www.newtonsoft.com/json/help/html/P_Newtonsoft_Json_Linq_JToken_Path.htm)でパスを取得できます。 – dbc