$ .param序列化对象为JSON

时间:2018-11-16 12:35:18

标签: javascript python jquery json serialization

我使用 $。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&rows5B0%5D%5BValue%5D = 6&rows%5B0%5D%5BCampaignType%5D = CampaignType%3F&rows%5B0%5D %5BCampaignSubtype%5D =预定义+合同和行%5B0%5D%5BChannel%5D = WIND + STORE&rows%5B0%5D%5BPriority%5D = 1&rows%5B1%5D%5BSegment%5D = HH + wo + TV&rows%5B1%5D %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 = 2'

1 个答案:

答案 0 :(得分:0)

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

>>> 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。