使用 JSON.net 解析 InfluxDB 结果
Parsing InfluxDB result using JSON.net
我正在尝试制作一个命令行实用程序来初始化 InfluxDB 数据库,但我对 influx 和 C# 还是很陌生。
根据 Influx DB 数据库的以下响应,我试图在控制台中漂亮地打印它 window。
理想情况下,我会在标准错误缓冲区中显示错误,并在标准输出中显示警告或信息。
但是,当 运行 下面的代码在调试环境中时,根据我使用的几个 jsonpath 检查器,消息的格式似乎不正确。
JSON 输入为 result.Body
{
"results": [
{
"statement_id": 0,
"messages": [
{
"level": "warning",
"text": "deprecated use of 'CREATE RETENTION POLICY Primary ON SensorData DURATION 30d REPLICATION 1' in a read only context, please use a POST request instead"
}
]
}
]
}
JSON 输出为转换前的消息:
messages {{
"level": "warning",
"text": "deprecated use of 'CREATE RETENTION POLICY Primary ON SensorData DURATION 30d REPLICATION 1' in a read only context, please use a POST request instead"
}} Newtonsoft.Json.Linq.JToken {Newtonsoft.Json.Linq.JObject}
如您所见,消息输出在嵌套对象 {{}} 中,而不是预期的数组...
根据 https://jsonpath.curiousconcept.com/ 和其他几个 jsonpath 检查器,我期待类似的东西:
[
{
"level":"warning",
"text":"deprecated use of 'CREATE RETENTION POLICY Primary ON SensorData DURATION 30d REPLICATION 1' in a read only context, please use a POST request instead"
}
]
C#
private static void PrintResult(IInfluxDataApiResponse result)
{
var output = result.Success ? System.Console.Out : System.Console.Error;
output.WriteLine("["+result.StatusCode + "] : "+result.Body);
var json = JObject.Parse(result.Body);
var messages = json.SelectToken("$.results[*].messages[*]"); //outputs an array of messages if exists. e.g. [{level:warning,text:test}]
if (messages != null)
{
var transformed = messages.Select(m => new { level = (string)m["level"], text = (string)m["text]"] }).ToList();
foreach (var msg in transformed)
{
output.WriteLine($"[{result.StatusCode}] : {msg.level} - {msg.text}");
}
}
}
至少对我来说,使用 var messages =
json.SelectTokens("$.results[*].messages[*]");
而不是
json.SelectToken("$.results[*].messages[*]");
允许我解决这个问题,因为我可以将结果视为 C# 可枚举,而不是特殊外壳 1 结果与 SelectToken 的许多结果,因为它似乎将单个结果扁平化为一个对象,而其他实现会将其设置为一个数组。
我正在尝试制作一个命令行实用程序来初始化 InfluxDB 数据库,但我对 influx 和 C# 还是很陌生。
根据 Influx DB 数据库的以下响应,我试图在控制台中漂亮地打印它 window。
理想情况下,我会在标准错误缓冲区中显示错误,并在标准输出中显示警告或信息。
但是,当 运行 下面的代码在调试环境中时,根据我使用的几个 jsonpath 检查器,消息的格式似乎不正确。
JSON 输入为 result.Body
{
"results": [
{
"statement_id": 0,
"messages": [
{
"level": "warning",
"text": "deprecated use of 'CREATE RETENTION POLICY Primary ON SensorData DURATION 30d REPLICATION 1' in a read only context, please use a POST request instead"
}
]
}
]
}
JSON 输出为转换前的消息:
messages {{
"level": "warning",
"text": "deprecated use of 'CREATE RETENTION POLICY Primary ON SensorData DURATION 30d REPLICATION 1' in a read only context, please use a POST request instead"
}} Newtonsoft.Json.Linq.JToken {Newtonsoft.Json.Linq.JObject}
如您所见,消息输出在嵌套对象 {{}} 中,而不是预期的数组...
根据 https://jsonpath.curiousconcept.com/ 和其他几个 jsonpath 检查器,我期待类似的东西:
[
{
"level":"warning",
"text":"deprecated use of 'CREATE RETENTION POLICY Primary ON SensorData DURATION 30d REPLICATION 1' in a read only context, please use a POST request instead"
}
]
C#
private static void PrintResult(IInfluxDataApiResponse result)
{
var output = result.Success ? System.Console.Out : System.Console.Error;
output.WriteLine("["+result.StatusCode + "] : "+result.Body);
var json = JObject.Parse(result.Body);
var messages = json.SelectToken("$.results[*].messages[*]"); //outputs an array of messages if exists. e.g. [{level:warning,text:test}]
if (messages != null)
{
var transformed = messages.Select(m => new { level = (string)m["level"], text = (string)m["text]"] }).ToList();
foreach (var msg in transformed)
{
output.WriteLine($"[{result.StatusCode}] : {msg.level} - {msg.text}");
}
}
}
至少对我来说,使用 var messages =
json.SelectTokens("$.results[*].messages[*]");
而不是
json.SelectToken("$.results[*].messages[*]");
允许我解决这个问题,因为我可以将结果视为 C# 可枚举,而不是特殊外壳 1 结果与 SelectToken 的许多结果,因为它似乎将单个结果扁平化为一个对象,而其他实现会将其设置为一个数组。