2013-03-22 60 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