尝试将字符串传递到 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();
}
附带说明一下,我认为使用 NEST
和 Elasticsearch.NET
nuget 包测试 Elasticsearch 会更容易。
我正在尝试将我的变量查询作为 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();
}
附带说明一下,我认为使用 NEST
和 Elasticsearch.NET
nuget 包测试 Elasticsearch 会更容易。