【问题标题】:Parse decodeURIComponent JSON string with Python使用 Python 解析 decodeURIComponent JSON 字符串
【发布时间】:2016-09-28 05:04:11
【问题描述】:

我有一个“深”的 JSON 字符串,需要在 URL 中作为 GET 变量传递。如下所示:

{
  "meta": {
    "prune": true,
    "returnFields": ["gf", "gh", "gh", "rt"],
    "orient": "split"
  },
  "indicators": [{
    "type": "beta",
    "computeOn": "gf",
    "parameters": {
      "timeperiod": 5,
      "nbdevup": 2,
      "nbdevdn": 2,
      "matype": 0
    }
  }, {
    "type": "alpha",
    "computeOn": "gf",
    "parameters": {
      "timeperiod": 30
    }
  }]
};

使用jQuery.param编码时,结果如下:

var recursiveEncoded = jQuery.param(body);
console.log(recursiveEncoded);
meta%5Bprune%5D=true&meta%5BreturnFields%5D%5B%5D=gf&meta%5BreturnFields%5D%5B%5D=gh&meta%5BreturnFields%5D%5B%5D=gh&meta%5BreturnFields%5D%5B%5D=rt&meta%5Borient%5D=split&indicators%5B0%5D%5Btype%5D=beta&indicators%5B0%5D%5BcomputeOn%5D=gf&indicators%5B0%5D%5Bparameters%5D%5Btimeperiod%5D=5&indicators%5B0%5D%5Bparameters%5D%5Bnbdevup%5D=2&indicators%5B0%5D%5Bparameters%5D%5Bnbdevdn%5D=2&indicators%5B0%5D%5Bparameters%5D%5Bmatype%5D=0&indicators%5B1%5D%5Btype%5D=alpha&indicators%5B1%5D%5BcomputeOn%5D=gf&indicators%5B1%5D%5Bparameters%5D%5Btimeperiod%5D=30

解码如下:

var recursiveDecoded = decodeURIComponent( jQuery.param(body) );
console.log(recursiveDecoded);

meta[prune]=true&meta[returnFields][]=gf&meta[returnFields][]=gh&meta[returnFields][]=gh&meta[returnFields][]=rt&meta[orient]=split&indicators[0][type]=beta&indicators[0][computeOn]=gf&indicators[0][parameters][timeperiod]=5&indicators[0][parameters][nbdevup]=2&indicators[0][parameters][nbdevdn]=2&indicators[0][parameters][matype]=0&indicators[1][type]=alpha&indicators[1][computeOn]=gf&indicators[1][parameters][timeperiod]=30

如果只是在服务器上使用序列化字符串结果,将字符串作为键值对中的键:

"query": {
    "{\"meta\":{\"prune\":true,\"returnFields\":[\"gf\",\"gh\",\"gh\",\"rt\"],\"orient\":\"split\"},\"indicators\":[{\"type\":\"beta\",\"computeOn\":\"gf\",\"parameters\":{\"timeperiod\":5,\"nbdevup\":2,\"nbdevdn\":2,\"matype\":0}},{\"type\":\"alpha\",\"computeOn\":\"gf\",\"parameters\":{\"timeperiod\":30}}]}": ""
  },

我的后端处理是用 Python 完成的。存在哪些模块可以将上述结果转换为类似于原始对象的dict

【问题讨论】:

  • 您最好将其作为 JSON 发送,然后将其反序列化为 Python 中的对象。这样就不那么乱了。
  • 要求是作为GET请求发送。我已经完成了可以处理 JSON 字符串的 POST 请求。
  • 您可以使用 GET 方法在 jQuery 中发送一个对象,而无需使用$.param()。如果您确保您的数据在服务器上也以 JSON 格式结束,作为您的 AJAX 请求的结果,那么您应该没问题。在最坏的情况下,您必须将 dataType 设置为 'json'
  • @strimp 然后 URL 编码一个序列化的 JSON 字符串并将其作为单个 GET 参数发送。一样的区别。我从来没有说过任何关于 POST 的事情。 :) 是否有一些要求将其拆分为您无法控制的不同查询字符串值?
  • @haliphax 是的,我明白你的意思,这可以工作。我可以使用 Python 的 json.loads 方法来解析字符串服务器端。留下答案,如果作品将投票并接受。

标签: javascript jquery python json


【解决方案1】:

好吧,既然我们已经在 cmets 中进行了讨论,我将在此处发布答案以供后人参考。

在 JavaScript 端使用 JSON.stringify 的组合来序列化您的数据结构,在 Python 端使用 json.loads 来反序列化它。将序列化结构作为查询字符串参数(在您的示例中为“查询”)传递,然后从 Python 中的该查询字符串参数中读取值。呵呵!

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

【讨论】:

  • 在通过 jQuery 中的任何 AJAX 方法发送 JSON 之前,无需 JSON.stringify()
  • 是的,如果您使用的是 jQuery。我有点困惑,因为 OP 说过 jQuery 不是每个客户端的保证(尽管示例代码中使用了 jQuery)。
  • OP 是否说客户端正在发送一个字符串作为 GET 数据,而不是 GET 数据本身?为什么 OP 会期望服务器在他的服务器上接收这样的字符串?要求您的客户发送 POST 或 GET 数据,而不是疯狂的字符串。
  • 你失去了我。如果您的意思是他们应该拆分结构以便它在查询字符串中占用许多不同的键/值,我不明白为什么这是必要的。如果它表示单个对象,则将其作为单个查询字符串键/值对传递似乎就可以了。没有规则或 HTTP 规范说您需要这样做。数据序列化并不少见,尤其是复杂的嵌套结构。
猜你喜欢
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2011-09-08
  • 1970-01-01
相关资源
最近更新 更多