如何在SelectToken JSONPath查询中的运行时使用字符串值

时间:2018-03-02 08:05:28

标签: c# json.net jsonpath

我有以下代码,我在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查询中使用单引号而不是运行时字符串值,这是一个限制吗?

1 个答案:

答案 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