【问题标题】:Python: {"errors":{"":["Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Python: {"errors":{"":["无法将当前 JSON 数组(例如 [1,2,3])反序列化为类型 '
【发布时间】:2020-12-05 06:04:29
【问题描述】:

我的dict格式数据json_output在Python中是这样的:

[{'code': 'Z0001001',
  'dateList': [{'FDate': '2008-01-11T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-01-18T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-01-25T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-01-31T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-02-08T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-02-15T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-02-22T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-02-29T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-03-07T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-03-14T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-03-21T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-03-31T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-04-11T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-04-18T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-04-25T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-04-30T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-05-09T00:00:00', 'value': 326.2068965517241},
   {'FDate': '2008-05-16T00:00:00', 'value': 326.2068965517241},
   {'FDate': '2008-05-23T00:00:00', 'value': 326.2068965517241},
   {'FDate': '2008-05-30T00:00:00', 'value': 329.3333333333333}]},
 {'code': 'Z0001002',
  'dateList': [{'FDate': '2008-01-11T00:00:00', 'value': 294.2857142857143},
   {'FDate': '2008-01-18T00:00:00', 'value': 294.2857142857143},
   {'FDate': '2008-01-25T00:00:00', 'value': 294.2857142857143},
   {'FDate': '2008-01-31T00:00:00', 'value': 294.2857142857143},
   {'FDate': '2008-02-08T00:00:00', 'value': 297.14285714285717},
   {'FDate': '2008-02-15T00:00:00', 'value': 297.14285714285717},
   {'FDate': '2008-02-22T00:00:00', 'value': 297.14285714285717},
   {'FDate': '2008-02-29T00:00:00', 'value': 297.14285714285717},
   {'FDate': '2008-03-07T00:00:00', 'value': 307.14285714285717},
   {'FDate': '2008-03-14T00:00:00', 'value': 307.14285714285717},
   {'FDate': '2008-03-21T00:00:00', 'value': 307.14285714285717},
   {'FDate': '2008-03-31T00:00:00', 'value': 307.14285714285717},
   {'FDate': '2008-04-11T00:00:00', 'value': 309.2857142857143},
   {'FDate': '2008-04-18T00:00:00', 'value': 309.2857142857143},
   {'FDate': '2008-04-25T00:00:00', 'value': 309.2857142857143},
   {'FDate': '2008-04-30T00:00:00', 'value': 309.2857142857143},
   {'FDate': '2008-05-09T00:00:00', 'value': 309.2857142857143},
   {'FDate': '2008-05-16T00:00:00', 'value': 309.2857142857143},
   {'FDate': '2008-05-23T00:00:00', 'value': 309.2857142857143},
   {'FDate': '2008-05-30T00:00:00', 'value': 309.2857142857143}]}]

然后我使用json.dumps()将其转换为json格式,以便我可以通过api将json数据转换为SQL server。

data_json = json.dumps(json_output)

from requests_negotiate_sspi import HttpNegotiateAuth
url = "http://xxx/api/xxx"
r_json = requests.post(url, data_json,headers={'Content-Type':'application/json'},auth=HttpNegotiateAuth())
print(r_json)
print(r_json.text)
print(r_json.status_code)
print(r_json.raise_for_status())

但是,当我运行它时,它给了我这样的错误:

{"errors":{"":["Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'ZSFund.DataService.Web.Models.Code.CodeValueMaintainEntity' because the type requires a JSON object (e.g. {\"name\":\"value\"}) to deserialize correctly.\r\nTo fix this error either change the JSON to a JSON object (e.g. {\"name\":\"value\"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. 

我尝试将它们一一转换,就像一次将Z0001001转换成SQL一样,格式如下:

{'code': 'Z0001001',
  'dateList': [{'FDate': '2008-01-11T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-01-18T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-01-25T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-01-31T00:00:00', 'value': 308.7931034482759},
   {'FDate': '2008-02-08T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-02-15T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-02-22T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-02-29T00:00:00', 'value': 309.82758620689657},
   {'FDate': '2008-03-07T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-03-14T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-03-21T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-03-31T00:00:00', 'value': 323.9655172413793},
   {'FDate': '2008-04-11T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-04-18T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-04-25T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-04-30T00:00:00', 'value': 324.48275862068965},
   {'FDate': '2008-05-09T00:00:00', 'value': 326.2068965517241},
   {'FDate': '2008-05-16T00:00:00', 'value': 326.2068965517241},
   {'FDate': '2008-05-23T00:00:00', 'value': 326.2068965517241},
   {'FDate': '2008-05-30T00:00:00', 'value': 329.3333333333333},}]}

它显示一切正常,没有任何问题,所以我猜数组或列表可能有问题。有什么想法吗?

【问题讨论】:

  • 看起来您在Z0001002 之前多了一个右括号},}]},。试试改成}]},
  • @thorntonc 我的错,这是一个编辑错误,我已经更正了。问题仍然存在。
  • 这行得通吗? r_json = requests.post(url, json_output,headers={'Content-Type':'application/json'},auth=HttpNegotiateAuth())post() 的调用需要一个列表或字典,并将为您将json_output 序列化为json。
  • @MikeOrganek 它不起作用。反馈是&lt;Response [400]&gt; {"errors":{"":["Unexpected character encountered while parsing value: c. Path '', line 0, position 0."]},"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"|e91ae74a-4998ab96d1d19138."}

标签: python sql arrays json api


【解决方案1】:

问题解决了。问管理员post问题,答案是“SQL Server现在无法输入Json数组数据,应该在for循环中一一进行”。在这个例子中,它是:

for i in json_output:
    data_json = json.dumps(i)
    url = "http://xxx/api/xxx"
    r_json = requests.post(url, data_json,headers={'Content-Type':'application/json'},auth=HttpNegotiateAuth())
    print(r_json)
    print(r_json.text)
    print(r_json.status_code)
    print(r_json.raise_for_status())

而且效果很好。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2019-03-20
    • 2018-12-30
    • 1970-01-01
    • 2022-01-02
    • 2014-03-20
    相关资源
    最近更新 更多