从字符串创建JSON数据并使用json.dumps

时间:2014-07-23 00:15:09

标签: json python-2.7 influxdb

我正在尝试创建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"]}]

2 个答案:

答案 0 :(得分:1)

您不需要手动创建JSON。只需将适当的Python结构传递给write_points函数即可。尝试类似的东西:

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

client.write_points(data)

答案 1 :(得分:0)

请访问JSON.org以获取正确的JSON结构。我可以看到你自己生成的JSON有几个错误:

  1. 最外面的项目可以是无序对象,由花括号{}括起来,也可以是括号[]括起来的有序数组。不要同时使用两者。由于您的数据结构类似于dict,因此花括号是合适的。
  2. 所有字符串都需要用 double 引号括起来,而不是单引号。 "This is valid JSON"'This is not valid'
  3. 您的'points'值数组被双括号包围,这是不必要的。只使用一套。
  4. 请查看documentation of the json module以了解有关如何使用它的详细信息。基本上,您可以提供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,依靠专用模块来完成它。