我有以下代码,我在C#中使用流行的Newtonsoft库
string json = {
"students": [
{
"name": "student 1",
"grades": [
{
"subject1": "A",
"subject2": "B"
}
]
}
]
}
JObject rootJObject = JObject.Parse(json);
我想选择一个特定的学生对象。如果我使用下面的文字字符串查询JSONPath,我将获得实际的对象
rootJObject.SelectToken("$.students[?(@.name=='student 1')]");
现在如果我想在运行时传递查询字符串,如下所示
string studentName = "student 1";
rootJObject.SelectToken($"$.students[?(@.name=={studentName})]");
它会抛出"Unexpected character while parsing path query: s"
我们可以在JSONPath查询中使用单引号而不是运行时字符串值,这是一个限制吗?
答案 0 :(得分:1)
如Querying JSON with JSONPath所示,您需要在过滤器表达式中将单引号放在字符串文字周围。因此Book.collection.aggregate([
{'$lookup' => {'from' => "authors",
'localField' => "_id",
'foreignField' => "book_id",
'as' => "authors"}},
{'$unwind' => '$authors'},
{'$project' => {'id' => '$authors._id', '_id' => 0, 'title' => 1, "isbn" => 1, "copies" => 1, "updated_at" => 1,
"authors" => { 'id' => '$_id', 'first' => 1, 'last' => 1, 'book_id' => 1, 'updated_at' => 1}}}
])
应为{studentName}
:
'{studentName}'
或者,使用旧的string.Format()
样式:
var result = rootJObject.SelectToken($"$.students[?(@.name=='{studentName}')]");
或者使用简单的字符串连接:
var result = rootJObject.SelectToken(string.Format("$.students[?(@.name=='{0}')]", studentName));
请注意,“字符串文字”并不表示“完全在编译时构造的字符串”,它表示“字符串值包含在JSONPath表达式中”。可以传入由任何方法构造的任何c#字符串。在上面的每个语句中,通过用单引号括住var result2 = rootJObject.SelectToken("$.students[?(@.name=='" + studentName + "')]");
变量的值并将其嵌入完整的JSONPath表达式,在运行时构造字符串。第一个语句使用string interpolation,而第二个语句使用显式函数调用,但两者都做同样的事情。
示例.Net fiddle。