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'
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
があります。次に、上記のコードを使用して、その文字列を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:)
には次の宣言があります。
func data(using encoding: String.Encoding, allowLossyConversion: Bool = default) -> Data?
指定されたエンコーディングを使用してエンコードされた文字列の表現を含むデータを返します。
Swift 4では、String
のdata(using:allowLossyConversion:)
をJSONDecoder
のdecode(_:from:)
と組み合わせて使用して、JSON文字列をディクショナリにデシリアライズすることができます。
さらに、Swift 3およびSwift 4では、String
のdata(using:allowLossyConversion:)
をJSONSerialization
のjsonObject(with:options:)
と組み合わせて使用して、JSON文字列をディクショナリにデシリアライズすることもできます。
Swift 4では、JSONDecoder
には decode(_:from:)
というメソッドがあります。 decode(_:from:)
には次の宣言があります。
func decode<T>(_ type: T.Type, from data: Data) throws -> T where T : Decodable
指定されたJSON表現から指定されたタイプのトップレベルの値をデコードします。
以下のPlaygroundコードは、data(using:allowLossyConversion:)
とdecode(_:from:)
を使用して、JSON形式のDictionary
からString
を取得する方法を示しています。
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)
}
}
Swift 3およびSwift 4では、JSONSerialization
には jsonObject(with:options:)
というメソッドがあります。 jsonObject(with:options:)
には次の宣言があります。
class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any
指定されたJSONデータからFoundationオブジェクトを返します。
以下のPlaygroundコードは、data(using:allowLossyConversion:)
とjsonObject(with:options:)
を使用して、JSON形式のDictionary
からString
を取得する方法を示しています。
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)