Python:查询字典转换为JSON

8

我正在尝试使用encodeURIComponent()方法将一些JSON数据以查询字符串的形式发送到我的Django应用程序。我的服务器端点可以正常接收数据,因为我可以将其打印到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 - abarnert
同时,如果您没有展示包含这样数据的任何输入,那么您如何获得类似于所需输出的字典列表?请给我们一个真实的例子。 - abarnert
4个回答

19

QueryDict类是常规 Python 字典的一个子类,除了它可以处理同一个键对应多个值的情况(参见MultiValueDict实现)。

如果你想将它转换成字符串,只需使用 json.dumps()

json.dumps(my_query_dict) 

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

QueryDict.dict()

返回 QueryDict 的字典表示。


太好了,这正是我需要理解的。 - d9120
6
如果一个键有多个值,那么这种方法就行不通。你甚至提到了MultiValueDict。 - dalore

2

另一种方法:

from django.http import QueryDict

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

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

1
如果您想处理多个值,可以按照以下方式操作:
json.dumps({k: d.getlist(k) for k in d.keys()})

或者使用 join 来压缩代码:
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()})

1
我正在使用Python 2.7.13和Django 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接