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返回中文字典编码错误的解决方案

HTTP请求错误400401402403404405406407412414500501502解析

在 django rest api 中使用 POST 解析 Json 错误