0

InfluxDB に渡す JSON データを作成しようとしています。文字列を使用して作成しましたが、エラーが発生します。私は何を間違っていますか。さまざまな投稿で提案されているように、json.dumps を使用しています。

基本的な Python コードは次のとおりです。

json_body = "[{'points':["
json_body += "['appx', 1, 10, 0]"
json_body += "], 'name': 'WS1', 'columns': ['RName', 'RIn', 'SIn', 'OIn']}]"

print("Write points: {0}".format(json_body))
client.write_points(json.dumps(json_body))

私が得る出力は

Write points: [{'points':[['appx', 1, 10, 0]], 'name': 'WS1', 'columns': ['RName', 'RIn', 'SIn', 'OIn']}]
Traceback (most recent call last):

line 127, in main
    client.write_points(json.dumps(json_body))
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 173, in write_points
    return self.write_points_with_precision(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 197, in write_points_with_precision
    status_code=200
  File "/usr/local/lib/python2.7/dist-packages/influxdb/client.py", line 127, in request
    raise error
influxdb.client.InfluxDBClientError

二重引用符も試しましたが、同じエラーが発生します。これは (ソリューションを最小化するための) スタブ コードです。この例では、ポイント リストに含まれるリスト オブジェクトは 1 つだけですが、実際には複数含まれています。さまざまな API 呼び出しの出力を読み取る JSON コードを生成しています。

json_body = '[{\"points\":['
json_body += '[\"appx\", 1, 10, 0]'
json_body += '], \"name\": \"WS1\", \"columns\": [\"RName\", \"RIn\", \"SIn\", \"OIn\"]}]'

print("Write points: {0}".format(json_body))
client.write_points(json.dumps(json_body))

以下のものを使用するとうまくいくことを理解しています:

json_body = [{ "points": [["appx", 1, 10, 0]], "name": "WS1", "columns": ["Rname", "RIn", "SIn", "OIn"]}]
4

2 に答える 2

1

JSON を手動で作成する必要はありません。適切な Python 構造をwrite_points関数に渡すだけです。そのようなことを試してください:

data = [{'points':[['appx', 1, 10, 0]],
         'name': 'WS1',
         'columns': ['RName', 'RIn', 'SIn', 'OIn']}]

client.write_points(data)
于 2014-07-23T09:18:45.360 に答える
0

適切な JSON 構造については、JSON.orgにアクセスしてください。自己生成された JSON にいくつかのエラーが表示されます。

  1. 最も外側の項目は、中括弧で囲まれた順序付けられていないオブジェクト、{}または括弧で囲まれた順序付けられた配列にすることができます[]。両方を使用しないでください。データは dict のように構造化されているため、中括弧が適切です。
  2. すべての文字列は、一重引用符ではなく二重引用符で囲む必要があります。"This is valid JSON". 'This is not valid'.
  3. 値の'points'配列は二重括弧で囲まれていますが、これは不要です。1セットのみ使用してください。

使用方法の詳細については、モジュールのドキュメントjsonを参照してください。基本的に、json.dumps()Python データ構造をフィードすると、有効な JSON として出力されます。

In [1]: my_data = {'points': ["appx", 1, 10, 0], 'name': "WS1", 'columns': ["RName", "RIn", "SIn", "OIn"]}

In [2]: my_data
Out[2]: {'points': ['appx', 1, 10, 0], 'name': 'WS1', 'columns': ['RName', 'RIn', 'SIn', 'OIn']}

In [3]: import json

In [4]: json.dumps(my_data)
Out[4]: '{"points": ["appx", 1, 10, 0], "name": "WS1", "columns": ["RName", "RIn", "SIn", "OIn"]}'

最初に Python データ構造を使用する価値に気付くでしょう。これは Python であるため、一重引用符と二重引用符を気にする必要がなく、json.dumps()自動的に変換されます。ただし、一重引用符が埋め込まれた文字列を作成すると、次のようになります。

In [5]: op_json = "[{'points':[['appx', 1, 10, 0]], 'name': 'WS1', 'columns': ['RName', 'RIn', 'SIn', 'OIn']}]"

In [6]: json.dumps(op_json)
Out[6]: '"[{\'points\':[[\'appx\', 1, 10, 0]], \'name\': \'WS1\', \'columns\': [\'RName\', \'RIn\', \'SIn\', \'OIn\']}]"'

データ構造ではなく に文字列を供給したためです。json.dumps()

したがって、次回は JSON を自分で作成しようとせず、専用のモジュールに頼ってください。

于 2014-07-23T01:22:03.233 に答える