【问题标题】:Parse the following query string into json using python使用python将以下查询字符串解析为json
【发布时间】:2015-08-11 06:45:17
【问题描述】:

我有一个格式如下的查询字符串:

 cmd=get-records&limit=100&offset=0&search[0][field]=number&search[0][type]=text&search[0][operator]=contains&search[0][value]=Mike+Jones&search[1][field]=name&search[1][type]=text&search[1][operator]=contains&search[1][value]=Mike+Jones&search[2][field]=role&search[2][type]=text&search[6]&searchLogic=OR

如何将其转换为结构化 json,如下所示(或类似):

{
  cmd: "...",
  limit: "...",
  offset: "...",
  search: {
    0: {
      number: "..."
      name: "...",
      ...
    }
    1: {
      ...
    }
    ...
  }, 
  ...
}

我曾尝试使用urlparse.parse_qs,但它会将查询字符串转换为以下内容:

{
  "cmd": ["..."],
  "limit": ["..."],
  "offset": ["..."],
  "search[0][number]": ["..."],
  "search[0][name]": ["..."],
  "search[1][number]": ["..."].
  ...
}

问题在于搜索字段。我希望这个结构正确。我使用的技术如下:

前端:

从后端请求数据的 w2ui 表。此外,如本例所示,在进行搜索时,它会向后端发送请求以进行搜索。

后端:

姜戈。来自 w2ui 的 post 请求由一个视图处理,该视图接受查询字符串并采取相应的行动。

【问题讨论】:

  • 第一种格式不是严格的 JSON。所有 JSON 对象键都是字符串。所有 JSON 字符串都用双引号引起来。我可以看到显示的键和值不符合需要更多结构的应用程序的要求,但字符串周围的引号是正确的。见json.org

标签: python json django query-string w2ui


【解决方案1】:

看看querystring-parser 包,它可以满足您的需要:

import pprint

from querystring_parser import parser as qsparser

# I had to modify the query string you provided by adding a value
# search[6]; it didn't have one before, which caused an exception
query_string = (
    'cmd=get-records&limit=100&offset=0&search[0][field]=number&'
    'search[0][type]=text&search[0][operator]=contains&'
    'search[0][value]=Mike+Jones&search[1][field]=name&search[1][type]=text&'
    'search[1][operator]=contains&search[1][value]=Mike+Jones&'
    'search[2][field]=role&search[2][type]=text&search[6]=SEARCH6&'
    'searchLogic=OR'
    )  # NOTE: I had

query_string_as_dict = qsparser.parse(query_string)

pprint.pprint(query_string_as_dict)

结果是:

{u'cmd': u'get-records',
 u'limit': 100,
 u'offset': 0,
 u'search': {0: {u'field': u'number',
                 u'operator': u'contains',
                 u'type': u'text',
                 u'value': u'Mike Jones'},
             1: {u'field': u'name',
                 u'operator': u'contains',
                 u'type': u'text',
                 u'value': u'Mike Jones'},
             2: {u'field': u'role', u'type': u'text'},
             6: u'SEARCH6'},
 u'searchLogic': u'OR'}

如果你想要它为 JSON:

import json

json_string = json.dumps(query_string_as_dict)

【讨论】:

  • 打败我!这个库看起来很棒,但很遗憾数组被解析为字典。
  • @Ashley'CptLemming'Wilson,在这种情况下它不能用作列表,但我只是尝试将6 更改为3,它仍然是一个字典。我想它可以检测到从0 开始的递增键,但无论如何,这样做并没有太多额外的好处,如果有的话。
【解决方案2】:

也许看看这个库:querystring-parser

它需要section[1]['words'][2]=a&section[0]['words'][2]=a&section[0]['words'][2]=b 并将其转换为{u'section': {0: {u'words': {2: [u'a', u'b']}}, 1: {u'words': {2: u'a'}}}},这看起来就像您所追求的那样。

他们在 Django 中使用它的文档:

from querystring_parser import parser
post_dict = parser.parse(request.GET.urlencode())

【讨论】:

    【解决方案3】:

    如果您使用的是 Django,您可以在视图内的 request.GET 上拥有类似这样的结构信息。

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多