【问题标题】:$.param serialized object to JSON$.param 将对象序列化为 JSON
【发布时间】:2019-04-19 15:39:11
【问题描述】:

我使用 $.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=优先级+规则&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=预定义+合同&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=预定义+合同&rows%5B1%5D%5BChannel%5D=SMART+WIND+STORE+MALL&rows%5B1%5D%5BPriority %5D=2'

【问题讨论】:

  • 你还没有真正解释清楚你在做什么。什么在处理这个请求?您的服务器不仅仅是“Python”,大概它正在运行某种框架 - 哪个?您需要显示服务器端代码以及您尝试解码此参数的内容。
  • 它正在运行 falcon 来处理请求。正如我所提到的,我尝试了 json.(methods) 但它不起作用。问题是数据通过$.param序列化,然后通过服务器发送。
  • 不,这不是问题所在。但是您需要显示您的 Falcon 代码什么你试图传递给 json 方法?你真的需要一个 JSON 字符串还是一个字典?您希望如何处理这些数据?
  • 我尝试了转储和加载。我正在使用 req.stream.read() 读取数据。这就是我试图在转储和负载中传递的内容。我没有发布我的 Falcon 代码,因为我一直在更改它,我无法设法将数据转换为 json。
  • @DanielRoseman 发布了我在 API 中获得的信息。我试图用泡菜反序列化它,但它没有用。我找不到将其转换回对象的方法。

标签: javascript python jquery json serialization


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 2016-12-22
    • 2018-07-20
    • 2021-12-16
    相关资源
    最近更新 更多