【问题标题】:Parsing InfluxDB result using JSON.net使用 JSON.net 解析 InfluxDB 结果
【发布时间】:2017-12-12 02:39:55
【问题描述】:

我正在尝试制作一个用于初始化 InfluxDB 数据库的命令行实用程序,但我对 influx 和 C# 很陌生。

根据 Influx DB 数据库的以下响应,我正在尝试在控制台窗口中漂亮地打印它。

理想情况下,标准错误缓冲区中会显示错误,标准输出中会显示警告或信息。

但是,在调试环境中运行以下代码时,根据我使用的几个 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}");
            }
        }

    }

【问题讨论】:

  • 可能你被调试器弄糊涂了?因为messages {{ ... }} 甚至不是有效的 json,所以 JSON.NET 甚至不会解析它。

标签: c# json.net influxdb


【解决方案1】:

至少对于我来说,使用 var messages =

json.SelectTokens("$.results[*].messages[*]"); 

然后

json.SelectToken("$.results[*].messages[*]"); 

允许我解决该问题,因为我可以将结果视为 C# 可枚举,而不是特殊的套管 1 结果与 SelectToken 的许多结果,因为它似乎将单个结果扁平化为一个对象,而其他实现会让它成为一个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2014-03-05
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多