0

我正在尝试创建 JSON 数据以传递给 InfluxDB。我使用字符串创建它,但出现错误。我究竟做错了什么。我正在使用各种帖子中建议的 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

我也尝试过使用双引号,但得到了同样的错误。这是存根代码(以最小化解决方案),我在示例中意识到点列表仅包含一个列表对象,但实际上它包含多个。我正在生成通过各种 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.org了解正确的 JSON 结构。我可以看到您自己生成的 JSON 有几个错误:

  1. 最外面的项目可以是一个无序的对象,用花括号括起来,也可以是一个{}有序的数组,用括号括起来[]。不要同时使用两者。由于您的数据结构类似于字典,因此大括号是合适的。
  2. 所有字符串都需要用引号括起来,而不是单引号。"This is valid JSON". 'This is not valid'.
  3. 您的'points'值数组被双括号包围,这是不必要的。只使用一套。

有关如何使用它的详细信息,请查看该模块的文档。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 回答