web-dev-qa-db-ja.com

JSON文字列をNSDictionaryにデシリアライズするにはどうすればよいですか? (iOS 5以降の場合)

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'
150
Andreas

NSStringパラメーターを渡す必要がある場所で、NSDataパラメーターを渡すように見えます。

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

たとえば、NSString strChangetoJSONに特殊文字を含むNSStringがあります。次に、上記のコードを使用して、その文字列をJSON応答に変換できます。

36
Desert Rose

@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]);
5
Hemang

Swift 3およびSwift 4では、Stringには data(using:allowLossyConversion:) というメソッドがあります。 data(using:allowLossyConversion:)には次の宣言があります。

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

指定されたエンコーディングを使用してエンコードされた文字列の表現を含むデータを返します。

Swift 4では、Stringdata(using:allowLossyConversion:)JSONDecoderdecode(_:from:)と組み合わせて使用​​して、JSON文字列をディクショナリにデシリアライズすることができます。

さらに、Swift 3およびSwift 4では、Stringdata(using:allowLossyConversion:)JSONSerializationjson​Object(with:​options:​)と組み合わせて使用​​して、JSON文字列をディクショナリにデシリアライズすることもできます。


#1。 Swift 4ソリューション

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)
    }
}

#2。 Swift 3およびSwift 4ソリューション

Swift 3およびSwift 4では、JSONSerializationには json​Object(with:​options:​) というメソッドがあります。 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:​)を使用して、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)
    }
}
4
Imanou Petit

Abizern Swift 2.2のコードの使用

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