【问题标题】:Error when trying to pass a string into a json object c# - Current JsonReader item is not an object尝试将字符串传递到 json 对象时出错 c# - 当前 JsonReader 项不是对象
【发布时间】:2021-10-04 10:08:54
【问题描述】:

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

从 JsonReader 读取 JObject 时出错。当前 JsonReader 项不是对象:字符串。路径'',第 1 行,位置 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 } } }

那么jsonQuery成立:

{{  "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() 是在开头添加一个 { 并在末尾添加另一个 }。

【问题讨论】:

  • 我无法重现该问题。 JObject.Parse(query) 在代码示例中定义的字符串正确解析为 JSON 对象。你所说的“额外”{,}是什么意思? JSON 对象必须以左括号开头并以右括号结尾;这就是定义对象的原因。
  • 请查看更新后的帖子。但如果你仔细观察,.Parse() 在开头又加了一个 { ,最后又加了一个 }。然后我去jsonformatter.curiousconcept.com/#看看我的json格式是否正确,但这不是因为它添加了一个{和一个}

标签: c# json elasticsearch console-application


【解决方案1】:

双括号“问题”只是 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 会更容易。

【讨论】:

  • 哦,我明白了,我不知道只是在调试模式下你会看到一个额外的“{”。谢谢!是的,我对 NEST 做了同样的事情,只是想用 httpclient 试试。欣赏它! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多