用JSON填充NSDictionary

时间:2013-05-02 15:19:34

标签: ios objective-c json nsdictionary

我是iOS开发的新手。 我想填写这个json

"{
    "form_name":"login_form_mobile",
    "user_login":"mark wallet",
    "password":"123456",
    "dispatch":{"auth.login":"Sign in"}
}
"

进入NSDictionary,使用AFNetworking在post中使用它。

我像这样填写字典

NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:@"login_form_mobile",@"form_name",@"markwallet",@"user_login",@"123456",@"password",@"{ \" auth.login \" : \" Sign in \" }",@"dispatch", nil];

现在我有两个问题 1 - 显示auth.login前后的\“,因为我只想显示双引号。 顺便说一句,我试图制作一个嵌套字典,这解决了第一个问题,但第二个问题没有解决。 2 - 当我运行应用程序时。并查看字典是如何填充的,它显示如下

 {
    dispatch = "{ \" auth.login \" : \" Sign in \" }";
    "form_name" = "login_form_mobile";
    password = 123456;
    "user_login" = markwallet;
}

a-键和它的值之间是相等的,我需要它:不是=
b-有些词没有“”像密码,123456和markwallet。我不知道为什么 c-我也不知道为什么派遣和它的价值在第一个。

编辑:

我使用了这个新代码。

NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"Sign in",@"auth.login", nil];

NSArray *keys = [NSArray arrayWithObjects:@"form_name",@"user_login",@"password",@"dispatch",nil];

NSArray *objects = [NSArray arrayWithObjects:@"login_form_mobile",@"markwalletz",@"123456",dic,nil];

NSMutableDictionary * params1 = [[NSMutableDictionary alloc]init];
params1 = [NSMutableDictionary dictionaryWithObjects:objects forKeys:keys];

但是当我在调试中看到params1值时

{
    dispatch =     {
        "auth.login" = "Sign in";
    };
    "form_name" = "login_form_mobile";
    password = 123456;
    "user_login" = markwalletz; }

这与我在问题顶部所述的需要不同 当我用这本词典发送请求时,它会回复BAD请求。

4 个答案:

答案 0 :(得分:4)

您需要了解的几件事情:

  • 当你NSLog NSDictionary时,它不显示JSON语法。是的,它表面看起来像JSON,但是,正如您所指出的,并非所有字符串都被引用(只有那些带有空格或奇数字符的字符串才能获得引号)并且使用=代替:。这是因为它是NSDictionary对象的description,而不是JSON转换。
  • 而另一方面,只是因为JSON和NSDictionary之间的东西看起来相同并不是一样的。您的"dispatch":{"auth.login":"Sign in"}条目代表第二个NSDictonary,作为关键“dispatch”的值。您不能简单地通过使字符看起来像JSON / description表示来创建第二个字典。相反,您必须(作为单独的概念步骤)创建该单元素字典,然后将其作为对象插入外部字典中。
  • NSDictionary和JSON 相同的一个地方是,NSDictionary和JSON“对象”都不维护它包含的键/值对的顺序。因此,不要期望在一个版本中看到相同顺序的值与另一个版本相同。

答案 1 :(得分:1)

查看NSJSONSerialization课程。此类中的方法将JSON转换为适当的对象(例如NSDictionary,NSArray),反之亦然。有关详细信息,请参阅Apple Documentation

<强>加了:

例如:

NSString *jsonString = ... // Whatever your JSON is
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *d = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];

你得到的是一个字典d,它包含JSON中描述的所有键及其值(假设JSON代表字典)。 JSON数据也可以表示对象数组。这一切都非常灵活。我建议阅读参考文档并使用NSJSONSerialization在此搜索其他示例。肯定有一些好的。

答案 2 :(得分:1)

“jsonString”变量应该形成如下:

NSString *jsonString = @"{\"form_name\":\"login_form_mobile\",\"user_login\":\"mark wallet\",\"password\":\"123456\",\"dispatch\":\{\"auth.login\":\"Sign in\"}}";

然后,使用上面的代码:

NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data 
                                                options:NSJSONReadingAllowFragments 
                                                  error:nil];
NSLog(@"DIC %@",dic);

将输出:

DIC {
dispatch =     {
    "auth.login" = "Sign in";
};
"form_name" = "login_form_mobile";
password = 123456;
"user_login" = "mark wallet";
}

答案 3 :(得分:0)

如果您的json字符串位于名为“jsonString”的NSString变量中:

NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data 
                                                    options:NSJSONReadingAllowFragments 
                                                      error:nil];

所以你的“dic”变量将有解析的json。