Django解析一个json请求,该请求的字典结果为

2024-09-28 22:40:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我将下面的NSMutableDictionary作为AFNetworking的参数从iPhone应用程序(ios6.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"];
}

在服务器中,我有以下视图:

^{pr2}$

下面一行显示错误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]

Tags: key服务器forinitvaluerequestpostproducts
2条回答

请求对象GET和POST可以包含多个相同键的值。特别是一些HTML表单元素,会为同一个键传递多个值。在

你路过请求.POST对象转换为JSON序列化程序,该序列化程序不允许具有相同名称的多个密钥。所以请检查一下请求.POST数据,查看是否获得多个同名密钥。如果是,则必须在传递给JSON load函数之前处理此数据。在

我希望它能给你一些解决问题的建议

这就是我最后发现的。。。问题从objective c开始,将字典按原样传递给AFNetworking,导致服务器端的密钥看起来很滑稽

  1. 我已经把NSDictionary转换成了NSData
  2. 已将NSData转换为NSString
  3. 使用“root”伪键和转换后的字符串作为值创建了一个新字典

以下是我更新的工作代码:

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) {...}

然后在服务器端:

^{pr2}$

希望这能为某人节省时间和痛苦:)

相关问题 更多 >