javascript - $.param 序列化对象到 JSON

标签 javascript python jquery json serialization

我使用 $.fileDownload 将数据从客户端发送到服务器 (Python)。 API 接收数据,但根据 jQuery fileDownload 文档 状态,数据使用 $.param 进行序列化。问题是我需要 JSON 格式的数据,以便我可以处理它并使用它的键:值对创建文件。我一直在试图解决这个问题,但似乎没有采取任何措施来“反序列化”它。似乎我一开始就无法让 $.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 指出:

// data must be an object (which will be $.param serialized) or already a key=value param string

编辑:

在我的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=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'

最佳答案

这是表单编码的数据,您可以使用 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。

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

相关文章:

javascript - 使用 javascript 淡入不同的部分并使用静态页眉和页脚?

javascript - 将字符串转换为包含多个对象的 json

javascript - 在 Promise .then 中无法访问 $scope

python - Sidekit 代码在创建功能后 UBM 创建期间卡住

jquery - 替换图像而不是文本不起作用

jquery - 单击时淡入不同的背景图像

javascript - 监听变量值的变化并处理点击事件

Python 'for loop' 解析结果

python - tf.py_function 无法返回列表?

JavaScript 起点函数不稳定