2013-03-22 90 views
1

我们必须创建一个Jason文件发送到服务器。 我发现做到这一点的方法是这样的:了解Json和NSData

NSDictionary* dic = @{@"Username" :userName, 
          @"Firstname" :firstName, 
          @"Lastname" : lastName, 
          @"Email" : email, 
          @"Password" : pass, 
     }; 
    NSData* json = [NSJSONSerialization dataWithJSONObject:dic options:0 error:nil]; 

我真的不明白,为什么在创建dic,这已经是一个JSON文件后,我已经创造了NSData时使用的NSJSONSerialization?为什么不把dic设置为NSData?这个序列化究竟做了什么? 另外,为什么不创建一个NSString将包含此结构?

+1

dic不是JSON数据,它是一个NSDictionnary。如果你不得不像字典一样向服务器发送数据,那么你可以使用简单的NSString对象以UTF8字符形式发送它。 – 2013-03-22 08:17:45

回答

2

dic是一个Objective-C字典(一组键值对),与JSON无关。打印字典可能看起来类似于JSON,但它不是。

NSJSONSerialization从字典中创建JSON数据。 JSON是文本格式,并记录了例如这里:http://www.json.org。为你的字典的JSON数据是这样的:

{"Firstname":"John","Email":"[email protected]","Username":"john","Lastname":"Doe","Password":"topsecret"} 

NSJSONSerialization创建NSData而不是NSString仅仅是类的作者的设计决策。您可以将数据转换为一个字符串与

NSString *jsonString = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding]; 
+0

非常感谢。我明白那个 。但为什么字典像@和{在开始时被写成json?为什么不只是用键来设置数值,然后把它序列化成json呢? – Curnelious 2013-03-22 08:56:06

+0

@Rant:'@ {@“Username”:userName,...}'是新的“Container Literal”语法(这里记录:http://clang.llvm.org/docs/ObjectiveCLiterals.html)。它可能看起来类似于JSON,但它完全不相关。 – 2013-03-22 09:02:47

+0

非常感谢您的回答。 – Curnelious 2013-03-22 09:26:53