我使用$ .fileDownload将数据从客户端发送到服务器(Python)。 API会接收数据,但是,如jQuery fileDownload docs所述,数据将使用$ .param进行序列化。问题是我需要使用JSON格式的数据,以便可以处理它并使用它的key:value对创建文件。我一直在试图解决这个问题,但是似乎似乎并没有采取任何措施来“反序列化”它。似乎我也无法让$ .fileDownload首先将数据作为JSON对象发送。有什么办法可以将序列化数据转换为JSON?

这是我的JavaScript请求:

let data = {
  'name': item.Name,
  'rows': item.rows
}

window.$.fileDownload('/api/export-report-excel', {
  httpMethod: 'POST',
  encodeHTMLEntities: true,
  data: data
})


在我的API中,我尝试了json方法(json.dumps等),但是无法转换序列化的对象。

$ .fileDownload状态:


  //数据必须是一个对象(将被序列化$ .param)或已经是一个key = value参数字符串


编辑:

在我的Falcon API中:

@route('/api/export-report-excel')
class ExportReportToExcel(object):

  def on_post(self, req, resp):
    data = req.stream.read()
    log.info(data)


log.info(data)输出:


  b'name =优先级+规则和行%5B0%5D%5BSegment%5D = HH + wo + TV&rows%5B0%5D%5BValue%5D = 6&rows%5B0%5D%5BCampaignType%5D = CampaignType%3F&rows%5B0%5Dtype%5BCamp 5D = Predefined + Contract&rows%5B0%5D%5BChannel%5D = WIND + STORE&rows%5B0%5D%5BPriority%5D = 1&rows%5B1%5D%5BSegment%5D = HH + wo + TV&rows%5B1%5D%5BValue%5D = 6&rows%5B1%5D%5BCampaignType%5D = CampaignType%3F&rows%5B1%5D%5BCampaignSubtype%5D = Predefined + Contract&rows%5B1%5D%5BChannel%5D = SMART + WIND + STORE + MALL&rows%5B1%5 %% 2'

最佳答案

这是表单编码的数据,您可以在Python中使用urllib.parse.parse_qs进行解析。

>>> from urllib import parse
>>> parse.parse_qs('name=Priority+Rules&rows%5B0%5D%5BSegment%5D=HH+wo+TV&rows%5B0%5D%5BValue%5D=6&rows%5B0%5D%5BCampaignType%5D=CampaignType%3F&rows%5B0%5D%5BCampaignSubtype%5D=Predefined+Contract&rows%5B0%5D%5BChannel%5D=WIND+STORE&rows%5B0%5D%5BPriority%5D=1&rows%5B1%5D%5BSegment%5D=HH+wo+TV&rows%5B1%5D%5BValue%5D=6&rows%5B1%5D%5BCampaignType%5D=CampaignType%3F&rows%5B1%5D%5BCampaignSubtype%5D=Predefined+Contract&rows%5B1%5D%5BChannel%5D=SMART+WIND+STORE+MALL&rows%5B1%5D%5BPriority%5D=2')

{'name': ['Priority Rules'],
 'rows[0][Segment]': ['HH wo TV'],
 'rows[0][Value]': ['6'],
 'rows[0][CampaignType]': ['CampaignType?'],
 'rows[0][CampaignSubtype]': ['Predefined Contract'],
 'rows[0][Channel]': ['WIND STORE'],
 'rows[0][Priority]': ['1'],
 'rows[1][Segment]': ['HH wo TV'],
 'rows[1][Value]': ['6'],
 'rows[1][CampaignType]': ['CampaignType?'],
 'rows[1][CampaignSubtype]': ['Predefined Contract'],
 'rows[1][Channel]': ['SMART WIND STORE MALL'],
 'rows[1][Priority]': ['2']}


我不知道Falcon,但我确信它可以直接访问此数据,而无需访问原始流或传递到parse_qs。在Django或Flask中,您可以通过request.POST来获得它,这是一个字典;浏览Falcon文档,看来req.params可能做类似的工作,尽管您可能需要先将auto_parse_form_urlencoded选项设置为True。

关于javascript - $ .param序列化对象为JSON,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53338028/

10-11 22:04