Django解析具有字典的json请求导致错误
Posted
技术标签:
【中文标题】Django解析具有字典的json请求导致错误【英文标题】:Django parsing a json request that has a dictionary result in error 【发布时间】:2013-12-24 11:02:10 【问题描述】:我将以下 NSMutableDictionary
作为 AFNetworking
的参数从 iPhone 应用程序 (ios 6.1) 传递到 Django 服务器
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setObject:[self getProductDictionary] forKey:@"prodDic"];
[parameters setObject:ApplicationDelegate.userUniqueId forKey:@"userID"];
[manager POST:BaseURLString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) ...
-(void) getProductDictionary
NSMutableDictionary *products = [[NSMutableDictionary alloc] init];
[products setObject:@"aaa" forKey:@"prod1"];
[products setObject:@"vvv" forKey:@"prod2"];
[products setObject:@"bbb" forKey:@"prod3"];
在服务器中我有以下视图:
import json
def foo(request):
if request.method == 'POST':
user_id = request.POST['userID']
products=json.loads(request.POST['prodDic'])
return HttpResponse("Done")
以下行导致错误products=json.loads(request.POST['prodDic'])
,错误为:raise MultiValueDictKeyError(repr(key)) MultiValueDictKeyError: "'prodDic'"
为了调试,我删除了该行并添加了以下代码:
#for debug
for key in request.POST:
value = request.POST[key]
print value
键如下所示:prodDic[prod1]
我怎样才能将字典接收到产品中,以便我可以像这样运行它:
for key in products:
value = products[key]
【问题讨论】:
【参考方案1】:请求对象 GET 和 POST 可以包含相同键的多个值。作为一些 html 表单元素,特别是,为同一个键传递多个值。
您将 request.POST 对象传递给 JSON 序列化程序,它不允许多个具有相同名称的键。因此,请检查您的 request.POST 数据,看看您是否获得了多个同名密钥。如果是,那么您必须在传递给 JSON 加载函数之前处理此数据。
希望能给你一些解决问题的指点
【讨论】:
【参考方案2】:这就是我最终发现的...问题始于目标 c,将字典按原样传递给 AFNetworking 导致服务器端的键看起来很有趣,所以
-
我已将 NSDictionary 转换为 NSData
将 NSData 转换为 NSString
使用“根”虚拟键和转换后的字符串作为值创建了一个新字典
这是我更新后的工作代码:
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
[parameters setObject:[self getProductDictionary] forKey:@"prodDic"];
[parameters setObject:ApplicationDelegate.userUniqueId forKey:@"userID"];
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:parameters options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
[manager POST:BaseURLString parameters:[[NSDictionary alloc] initWithObjectsAndKeys:jsonString, @"root",nil] success:^(AFHTTPRequestOperation *operation, id responseObject) ...
然后在服务器端:
import json
def foo(request):
if request.method == 'POST':
request_data=json.loads(request.POST['root'])
products=request_data['prodDic']
for key in products:
value=products[key]
#do my stuff
return HttpResponse("Done")
希望这可以节省时间和痛苦:)
【讨论】:
以上是关于Django解析具有字典的json请求导致错误的主要内容,如果未能解决你的问题,请参考以下文章
向 Django REST Framework 发送 jQuery 请求导致找不到 JSON 对象错误
django rest api:JSON 解析错误 - 无法解码 JSON 对象
Spring Java JPA 将 String 保存为 tinyblob,导致 json 解析错误
关于Django中JsonResponse返回中文字典编码错误的解决方案