从char索引确定JSONPath

时间:2017-10-11 14:10:49

标签: c# json.net jsonpath

C#中是否可以从char索引位置获取JSONPath?即想象一下将文本光标放在JSON字符串中,并希望从该位置知道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')]";

我搜索了一个图书馆或代码段,以帮助没有运气。什么是最好的方法?正则表达式是否合适?

1 个答案:

答案 0 :(得分: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字符串中的所有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