首页 > 解决方案 > REST API 中的 POST - JSON 无法序列化我的数据

问题描述

我正在尝试通过 REST API 发布一些数据。但是,使用以下代码,程序拒绝遵守(添加绒毛以提高可读性):

def Actions(self, imei, name):
    global addAttribute
    if addAttribute == True:
        attributes = {"decoder.timezone":"Etc/GMT"}
    else:
        attributes = ""
    url = "https://example.com/api/devices/"
    data = {"name":name, "uniqueId":imei, "attributes":attributes}
    print("data not transformed:")
    print(data)
    print()
    data_json = json.dumps(data)
    print("data transformed by json.dumps():")
    print(data_json)
    print()
    test = requests.post(url, auth=('mylogin', 'pwd'), json=data_json)
    print(test.content)

控制台说:

data not transformed:
{'name': 'Example 1', 'uniqueId': 'Example 1', 'attributes': {'decoder.timezone': 'Etc/GMT'}}

data transformed by json.dumps():
{"name": "Example 1", "uniqueId": "Example 1", "attributes": {"decoder.timezone": "Etc/GMT"}}

b'Cannot construct instance of `org.traccar.model.Device` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value (\'{"name": "Example 1",     "uniqueId": "Example 1", "attributes": {"decoder.timezone": "Etc/GMT"}}\')\n at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 1]'

也许我应该以不同的方式表达我的数据,而不是像字典一样?如果是这样,怎么做?

标签: pythonrest

解决方案


根据requests 文档,该字段json用于dict对象,该字段data用于string对象。

您在 astring的字段中传递 a dict。你可能想做这样的事情:

 data = {"name":name, "uniqueId":imei, "attributes":attributes}  
 data_json = json.dumps(data)  
 test = requests.post(url, auth=('mylogin', 'pwd'), data=data_json)
 print(test.content)

或类似的东西:

 data = {"name":name, "uniqueId":imei, "attributes":attributes}
 test = requests.post(url, auth=('mylogin', 'pwd'), json=data)
 print(test.content)

它们都应该工作,但您可能应该选择第二个,因为json.dump它是在 post 请求中完成的操作。


推荐阅读