在我的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'
答案 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字符串进入字典。
使用Swift 4,String
有一个名为decode(_:from:)
的方法。 data(using:allowLossyConversion:)
有以下声明:
JSONSerialization
从给定的JSON表示中解码给定类型的顶级值。
下面的Playground代码显示了如何使用jsonObject(with:options:)
和JSONDecoder
从格式为decode(_:from:)
的JSON中获取func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable
:
data(using:allowLossyConversion:)
使用Swift 3和Swift 4,decode(_:from:)
有一个名为jsonObject(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
从格式为jsonObject(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)