如何反序列化一个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, String
的data(using:allowLossyConversion:)
可以与JSONDecoder
的decode(_:from:)
一起使用,以便将JSONstring反序列化为字典。
而且,在Swift 3和Swift 4中, String
的data(using:allowLossyConversion:)
也可以和JSONSerialization
的jsonObject(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
有一个名为jsonObject(with:options:)
JSONSerialization
的方法。 jsonObject(with:options:)
具有以下声明:
class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any
从给定的JSON数据返回一个Foundation对象。
下面的Playground代码展示了如何使用data(using:allowLossyConversion:)
和jsonObject(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)