2017-12-12 12 views
0

InfluxDBデータベースを初期化するためのコマンドラインユーティリティを作成しようとしていますが、私はかなり流通しています。JSON.netを使用したInfluxDBの結果の解析

Influx DBデータベースからの次の応答では、私はコンソールウィンドウでこれをきれいに印刷しようとしています。

理想的には、標準エラーバッファにエラーが表示され、警告または情報が標準出力に表示されます。

しかし、デバッグ環境で以下のコードを実行すると、私が使用しているいくつかのjsonpathチェッカーによると、メッセージが不正な形式になっているように見えます。 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出力としてメッセージとして変換前

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} 

あなたが見ることができるように、メッセージ出力は、ネストされたオブジェクトである{{}}むしろ

01:予想通り、配列...

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}"); 
      } 
     } 

    } 
+0

デバッガで混乱している可能性がありますか? '{...}}'というメッセージがjsonでも有効ではないので、JSON.NETはそれを解析しません。 – Evk

答えて

0

私ができるよう、少なくとも、VARメッセージを使用して=というし

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

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

は、私は問題を回避することができ特殊ケーシング1とは対照的に、結果をC#の列挙型として扱いますselectTokenの結果と多くの結果を比較します。単一の結果をオブジェクトに展開しているように見えます。他の実装では配列になります。

関連する問題