【问题标题】:Python: Query Dict to JSONPython:查询字典到 JSON
【发布时间】:2014-11-06 01:10:22
【问题描述】:

我正在尝试使用 encodeURIComponent() 在查询字符串中将一些 JSON 发送到我的 django 应用程序,我的服务器 enpoint 接收到的数据很好,因为我可以将其打印到 python 控制台。

print request.GET

下一行的输出就是这种格式

<QueryDict: {u'[my json array]': [u''}}>

我想将其转换为 JSON,以便我可以用来获取一些信息,但我尝试使用 json.loads 和其他操作数据的方法,但没有成功。

我的输出应该是这样的

[{u'something': something}, {u'something1': something2}, {u'something3': something3}]

关于我在这里做错了什么的任何提示?

【问题讨论】:

  • “我想将其转换为 JSON,以便我可以使用它来获取一些信息,但我已经尝试使用 json.loads”。好吧,这是你的问题; json.loads 接受 JSON 并为您提供本机对象;如果要获取 JSON,则需要json.dumps
  • 同时,当您没有向我们展示任何包含任何此类数据的输入时,您如何获得像您想要的输出一样的字典列表?给我们一个真实的例子。

标签: python json django dictionary django-views


【解决方案1】:

另一种方式:

from django.http import QueryDict

# serialize
request.session["last_get_request"] = request.GET.urlencode()

# deserialize
last_get_request = QueryDict(request.session["last_get_request"])

【讨论】:

    【解决方案2】:

    如果你想处理多个值,你可以这样做:

    json.dumps({k: d.getlist(k) for k in d.keys()})
    

    或使用连接来紧凑:

    json.dumps({k: ",".join(d.getlist(k)) for k in d.keys()})
    

    或检查这是否是多值,然后才显示为列表

     json.dumps({k: (d.getlist(k) if len(d.getlist(k)) > 1 else d[k]) for k in d.keys()})
    

    【讨论】:

      【解决方案3】:

      我正在使用 Python 2.7.13Django 1.11.2。您可以获取您的 数据 字典,以便您可以使用相关的访问这些数据

      data = json.loads(request.GET.dict().keys()[0])
      

      我用来获取数据函数中的代码块输出也可以在底部使用。这将显示上述语句部分的

      但在这里我使用 POST 代替 GET,因为我们正在将数据发布到 服务器

      因此,在您的情况下,上述 1 行代码 足以将数据作为 字典 获取。

      import json
      
      # request.POST 
      print "request.POST = ", request.POST
      print type(request.POST),"\n"
      
      # DICTIONARY
      print "request.POST.dict() = ", request.POST.dict()
      print type(request.POST.dict()), "\n"
      
      # LIST ALL KEYS(here is only 1)
      print "request.POST.dict().keys() = ", request.POST.dict().keys()
      print type(request.POST.dict().keys()), "\n"
      
      # UNICODE
      print "request.POST.dict().keys()[0] = ", request.POST.dict().keys()[0]
      print type(request.POST.dict().keys()[0]), "\n"
      
      # GETTING THE ORIGINAL DATA(as Dictionary)
      data = json.loads(request.POST.dict().keys()[0])    
      
      # PRINTING DATA AND IT'S TYPE
      print "json.loads(request.POST.dict().keys()[0]): ", data
      print type(data), "\n"
      
      # ITERATING OVER ITEMS in data dictionary
      for key, value in data.iteritems():
          print key, value
      

      让我们看看输出,

      request.POST = <QueryDict: {u'{"fname":"Rishikesh Agrawani","email":"rishikesh0014051992@gmail.com","contact":"7353787704","message":"Have a nice day."}': [u'']}>
      <class 'django.http.request.QueryDict'> 
      
      request.POST.dict() =  {u'{"fname":"Rishikesh Agrawani","email":"rishikesh0014051992@gmail.com","contact":"7353787704","message":"Have a nice day."}': u''}
      <type 'dict'> 
      
      request.POST.dict().keys() =  [u'{"fname":"Rishikesh Agrawani","email":"rishikesh0014051992@gmail.com","contact":"7353787704","message":"Have a nice day."}']
      <type 'list'> 
      
      request.POST.dict().keys()[0] =  {"fname":"Rishikesh Agrawani","email":"rishikesh0014051992@gmail.com","contact":"7353787704","message":"Have a nice day."}
      <type 'unicode'> 
      
      json.loads(request.POST.dict().keys()[0]):  {u'message': u'Have a nice day.', u'contact': u'7353787704', u'email': u'rishikesh0014051992@gmail.com', u'fname': u'Rishikesh Agrawani'}
      <type 'dict'> 
      
      message Have a nice day.
      contact 7353787704
      email rishikesh0014051992@gmail.com
      fname Rishikesh Agrawani
      

      【讨论】:

        【解决方案4】:

        QueryDict 类是常规 Python 字典的 a subclass,除了它处理同一个键的多个值(参见 MultiValueDict implementation)。

        如果要将其转储为字符串,只需使用json.dumps()

        json.dumps(my_query_dict) 
        

        还有一个相关的dict()方法:

        QueryDict.dict()

        返回 QueryDict 的 dict 表示。

        【讨论】:

        • 太棒了,这正是我需要理解的。
        • 如果一个键有多个值,这将不起作用。你甚至提到了 MultiValueDict
        猜你喜欢
        • 1970-01-01
        • 2017-07-16
        • 1970-01-01
        • 1970-01-01
        • 2023-02-20
        • 1970-01-01
        • 2020-08-04
        • 2017-03-25
        • 2019-02-03
        相关资源
        最近更新 更多