Как десериализовать строку JSON в NSDictionary? (Для iOS 5+)



в моем iOS 5 приложение, у меня есть NSString который содержит строку JSON. Я бы хотел, чтобы десериализовать, что строковое представление JSON в уроженец

622   5  

5 ответов:

похоже, что вы передаете NSString параметр, где вы должны передавать

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

например у вас есть NSString специальные символы NSString strChangetoJSON. Затем вы можете преобразовать эту строку в JSON ответ, используя приведенный выше код.

Я сделал категорию из @Abizern answer

@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 ' s data(using:allowLossyConversion:) может использоваться в сочетании с JSONDecoder ' s decode(_:from:) для того, чтобы десериализовать JSON-строку в словарь.

кроме того, с Swift 3 и Swift 4, String ' s data(using:allowLossyConversion:) также может использоваться в сочетании с JSONSerialization ' s json​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.

код детской площадки ниже показывает, как использовать data(using:allowLossyConversion:) и decode(_:from:), чтобы получить Dictionary в формате JSON 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

возвращает объект Foundation из заданных данных JSON.

код игровой площадки ниже показывает, как использовать data(using:allowLossyConversion:) и json​Object(with:​options:​) для получения Dictionary в формате JSON 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)

Comments

    Ничего не найдено.