尝试将字符串传递到 json 对象时出错 c# - 当前 JsonReader 项不是对象

Error when trying to pass a string into a json object c# - Current JsonReader item is not an object

我正在尝试将我的变量查询作为 Json 对象传递。所以我在网上看到一种方法是 JObject.Parse()。我试图这样做,但是在调试时我注意到 .Parse() 会在变量 query 的内容的开头创建一个“{”,并在其内容的末尾创建一个“}”。因此,我随后尝试删除 query 中的第一个“{”和最后一个“}”,但每当我点击 JObject.Parse() 行时,它都会抛出一个异常:

Error reading JObject from JsonReader. Current JsonReader item is not an object: String. Path '', line 1, position 6.

所以我尝试在查询后使用代码,但是当我点击由 JObject.Parse():

组成的下一行时,这仍然会给我同样的错误
if (query.Length > 2){ 
   query = query.Substring(1, s.Length-2)
}

然后我在网上看到另一种解决此错误的方法是使用以下方法,但它不会删除第一个“{”和最后一个“}”。

query = query.TrimStart(new char[] { '{' }).TrimEnd(new char[] { '}' });

这是我的 query 的组成部分,也是我试图将查询作为 json 对象传递的内容:

var query = "{\"size\": 1000,\"query\": {\"bool\": {\"should\":[ {\"match\": { \"level\": \"Information\" } }, {\"match\": { \"level\": \"Error\" } } ], " +
                    "\"filter\": [ { \"range\": { \"@timestamp\": { \"gte\": \"2021-07-26T07:58:45.304-05:00\", \"lt\": \"2021-07-26T08:58:45.305-05:00\" } } } ]," +
                    "\"minimum_should_match\": 1 } } }";


        query = query.TrimStart(new char[] { '{' }).TrimEnd(new char[] { '}' });
         
    /*    if (query.Length > 2){ 
           query = query.Substring(1, s.Length-2)
        }  */

        var jsonQuery = JObject.Parse(query);

我将如何解决我遇到的问题 .Parse() 在开头和 } 和结尾添加额外的 {。

变量 Query 成立:

{"size": 1000,"query": {"bool": {"should":[ {"match": { "level": "Information" } }, {"match": { "level": "Error" } } ], "filter": [ { "range": { "@timestamp": { "gte": "2021-07-26T07:58:45.304-05:00", "lt": "2021-07-26T08:58:45.305-05:00" } } } ],"minimum_should_match": 1 } } }

然后json查询成立:

{{  "size": 1000,  "query": {    "bool": {      "should": [        {          "match": {            "level": "Information"          }        },        {          "match": {            "level": "Error"          }        }      ],      "filter": [        {          "range": {            "@timestamp": {              "gte": "2021-07-26T07:58:45.304-05:00",              "lt": "2021-07-26T08:58:45.305-05:00"            }          }        }      ],      "minimum_should_match": 1    }  }}}

如果仔细观察,.Parse() 会在开头添加一个 {,在结尾添加另一个 }。

双括号“问题”只是 Visual Studio 中 JObject 的调试器显示。如果您实际尝试将 JObject 输出为字符串,您将获得正确的输出。

static void Main(string[] args)
{
    var query = "{\"size\": 1000,\"query\": {\"bool\": {\"should\":[ {\"match\": { \"level\": \"Information\" } }, {\"match\": { \"level\": \"Error\" } } ], " +
            "\"filter\": [ { \"range\": { \"@timestamp\": { \"gte\": \"2021-07-26T07:58:45.304-05:00\", \"lt\": \"2021-07-26T08:58:45.305-05:00\" } } } ]," +
            "\"minimum_should_match\": 1 } } }";


    var jsonQuery = JObject.Parse(query);
    Console.WriteLine(jsonQuery); // all good!
    Console.ReadLine();
}

附带说明一下,我认为使用 NESTElasticsearch.NET nuget 包测试 Elasticsearch 会更容易。