如何将JSON字符串反序列化为NSDictionary? (适用于iOS 5+)

时间:2011-12-22 15:59:59

标签: ios json ios5 nsstring nsdictionary

在我的iOS 5应用中,我有一个包含JSON字符串的NSString。我想将该JSON字符串表示反序列化为本机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'

5 个答案:

答案 0 :(得分:319)

看起来您传递的NSString参数应该传递NSData参数:

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

答案 1 :(得分:36)

NSData *data = [strChangetoJSON dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data
                                                             options:kNilOptions
                                                               error:&error];

例如,NSString strChangetoJSON中有NSString个特殊字符。 然后,您可以使用上面的代码将该字符串转换为JSON响应。

答案 2 :(得分:5)

我已经从@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]);

答案 3 :(得分:4)

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

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

返回一个Data,其中包含使用给定编码编码的String的表示形式。

使用Swift 4,String的{​​{1}}可以与data(using:allowLossyConversion:)的{​​{1}}一起使用,以便将JSON字符串反序列化为字典。

此外,使用Swift 3和Swift 4,JSONDecoder的{​​{1}}也可以与decode(_:from:)的{​​{1}}结合使用,以反序列化JSON字符串进入字典。

#1。 Swift 4解决方案

使用Swift 4,String有一个名为decode(_:from:)的方法。 data(using:allowLossyConversion:)有以下声明:

JSONSerialization
  

从给定的JSON表示中解码给定类型的顶级值。

下面的Playground代码显示了如何使用json​Object(with:​options:​)JSONDecoder从格式为decode(_:from:)的JSON中获取func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable

data(using:allowLossyConversion:)

#2。 Swift 3和Swift 4解决方案

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

String
  

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

下面的Playground代码显示了如何使用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) } } JSONSerialization从格式为json​Object(with:​options:​)的JSON中获取class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any

data(using:allowLossyConversion:)

答案 4 :(得分:2)

使用swift 2.2的 Abizern 代码

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