如何反序列化一个JSONstring到一个NSDictionary? (对于iOS 5+)

在我的iOS 5应用程序中,我有一个包含JSONstring的NSString 。 我想将该JSONstring表示反序列化为本机NSDictionary对象。

  "{\"password\" : \"1234\", \"user\" : \"andreas\"}" 

我尝试了以下方法:

 NSDictionary *json = [NSJSONSerialization JSONObjectWithData:@"{\"2\":\"3\"}" options:NSJSONReadingMutableContainers error:&e]; 

但它会引发运行时错误。 我究竟做错了什么?

 -[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c' 

它看起来像你传递一个NSString参数,你应该传递一个NSData参数:

 NSError *jsonError; NSData *objectData = [@"{\"2\":\"3\"}" dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError]; 
 NSData *data = [strChangetoJSON dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 

例如你在NSString strChangetoJSON中有一个带有特殊字符的NSString 。 然后你可以使用上面的代码将该string转换为JSON响应。

我从@Abizern的答案做了一个类别

 @implementation NSString (Extensions) - (NSDictionary *) json_StringToDictionary { NSError *error; NSData *objectData = [self dataUsingEncoding:NSUTF8StringEncoding]; NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&error]; return (!json ? nil : json); } @end 

像这样使用它,

 NSString *jsonString = @"{\"2\":\"3\"}"; NSLog(@"%@",[jsonString json_StringToDictionary]); 

使用Swift 3和Swift 4, String有一个名为data(using:allowLossyConversion:)的方法data(using:allowLossyConversion:)data(using:allowLossyConversion:)具有以下声明:

 func data(using encoding: String.Encoding, allowLossyConversion: Bool = default) -> Data? 

返回包含使用给定编码编码的string表示的数据。

使用Swift 4, Stringdata(using:allowLossyConversion:)可以与JSONDecoderdecode(_:from:)一起使用,以便将JSONstring反序列化为字典。

而且,在Swift 3和Swift 4中, Stringdata(using:allowLossyConversion:)也可以和JSONSerializationjson​Object(with:​options:​) data(using:allowLossyConversion:)一起使用,以便将JSONstring反序列化成字典。


#1。 Swift 4解决scheme

使用Swift 4, JSONDecoder有一个名为decode(_:from:)decode(_:from:)具有以下声明:

 func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable 

从给定的JSON表示解码给定types的顶级值。

下面的Playground代码展示了如何使用data(using:allowLossyConversion:)decode(_:from:)以从JSON格式的String获取Dictionary

 let jsonString = """ {"password" : "1234", "user" : "andreas"} """ if let data = jsonString.data(using: String.Encoding.utf8) { do { let decoder = JSONDecoder() let jsonDictionary = try decoder.decode(Dictionary<String, String>.self, from: data) print(jsonDictionary) // prints: ["user": "andreas", "password": "1234"] } catch { // Handle error print(error) } } 

#2。 Swift 3和Swift 4解决scheme

使用Swift 3和Swift 4, JSONSerialization有一个名为json​Object(with:​options:​) JSONSerialization的方法。 json​Object(with:​options:​)具有以下声明:

 class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any 

从给定的JSON数据返回一个Foundation对象。

下面的Playground代码展示了如何使用data(using:allowLossyConversion:)json​Object(with:​options:​) data(using:allowLossyConversion:)以从JSON格式的String获取Dictionary

 import Foundation let jsonString = "{\"password\" : \"1234\", \"user\" : \"andreas\"}" if let data = jsonString.data(using: String.Encoding.utf8) { do { let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String : String] print(String(describing: jsonDictionary)) // prints: Optional(["user": "andreas", "password": "1234"]) } catch { // Handle error print(error) } } 

使用Abizern代码swift 2.2

 let objectData = responseString!.dataUsingEncoding(NSUTF8StringEncoding) let json = try NSJSONSerialization.JSONObjectWithData(objectData!, options: NSJSONReadingOptions.MutableContainers)