Django解析一个错误的字典结果的json请求

时间:2013-12-24 11:02:11

标签: python ios django json dictionary

我将以下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 debug
 for key in request.POST:
    value = request.POST[key]
    print value

键如下: prodDic [prod1]

如何将字典收到产品中,以便我可以像这样运行:

for key in products:
   value = products[key]

2 个答案:

答案 0 :(得分:1)

请求对象GET和POST可以包含多个相同键的值。作为一些HTML表单元素,值得注意的是,为同一个键传递多个值。

您正在将request.POST对象传递给JSON序列化程序,该序列化程序不允许多个具有相同名称的键。因此,请检查您的request.POST数据,看看您是否获得了多个具有相同名称的密钥。如果是,则必须在传递给JSON加载函数之前处理此数据。

我希望它会给你一些解决问题的指示

答案 1 :(得分:1)

这是我最终发现的......问题从目标c开始,将字典传递给AFNetworking导致服务器端的搞笑外观密钥所以

  1. 我已将NSDictionary转换为NSData
  2. 将NSData转换为NSString
  3. 创建了一个新词典,其中包含“root”虚拟键,转换后的字符串为值
  4. 这是我更新的工作代码:

    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")
    
    希望这能节省一些时间和时间。痛苦:)