从字符索引确定 JSONPath
Determine JSONPath from char index
在 C# 中是否可以从 char 索引位置获取 JSONPath?即想象将文本光标放在 JSON 字符串中,并想知道从该位置开始的 JSON 路径。
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')]";
我已经搜索了一个库或代码片段来提供帮助,但没有成功。什么是最好的方法?正则表达式合适吗?
我认为 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 字符串中的所有 newLines 和 carriageReturns 替换为空格,这样所有内容都在一行上...
现在获取字符串中特定位置的路径很容易:
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
在 C# 中是否可以从 char 索引位置获取 JSONPath?即想象将文本光标放在 JSON 字符串中,并想知道从该位置开始的 JSON 路径。
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')]";
我已经搜索了一个库或代码片段来提供帮助,但没有成功。什么是最好的方法?正则表达式合适吗?
我认为 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 字符串中的所有 newLines 和 carriageReturns 替换为空格,这样所有内容都在一行上...
现在获取字符串中特定位置的路径很容易:
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