Chcę utworzyć jedną funkcję w moim szybkim projekcie, która konwertuje ciąg znaków na format json Dictionary, ale mam jeden błąd:
Nie można przekonwertować typu wyrażenia (@lvalue NSData, opcje: IntegerLitralConvertible ...
To jest mój kod:
func convertStringToDictionary (text:String) -> Dictionary<String,String> {
var data :NSData = text.dataUsingEncoding(NSUTF8StringEncoding)!
var json :Dictionary = NSJSONSerialization.JSONObjectWithData(data, options:0, error: nil)
return json
}
Wykonuję tę funkcję w Objective-C:
- (NSDictionary*)convertStringToDictionary:(NSString*)string {
NSError* error;
//giving error as it takes dic, array,etc only. not custom object.
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
return json;
}
json
swift
dictionary
nsjsonserialization
trousout
źródło
źródło
let jsonDictionary = try JSONSerialization.jsonObject(with: jsonData, options: []) as! [String: String];
Odpowiedzi:
Ostrzeżenie: jest to wygodna metoda konwersji ciągu JSON na słownik, jeśli z jakiegoś powodu musisz pracować z ciągiem JSON. Ale jeśli masz dostępne dane JSON , powinieneś zamiast tego pracować z danymi , bez używania żadnego ciągu.
Szybki 3
Szybki 2
Oryginalna odpowiedź Swift 1:
W twojej wersji nie przekazałeś odpowiednich parametrów
NSJSONSerialization
i zapomniałeś rzutować wyniku. Lepiej też sprawdzić możliwy błąd. Ostatnia uwaga: działa to tylko wtedy, gdy twoją wartością jest łańcuch. Gdyby mógł to być inny typ, byłoby lepiej zadeklarować konwersję słownika w następujący sposób:i oczywiście musiałbyś także zmienić zwracany typ funkcji:
źródło
Zaktualizowałem odpowiedź Erica D dla Swift 5 :
źródło
Swift 3 :
źródło
W Swift 3
JSONSerialization
ma metodę o nazwiejsonObject(with:options:)
.jsonObject(with:options:)
posiada następującą deklarację:Podczas korzystania
jsonObject(with:options:)
, masz do czynienia z obsługi błędów (try
,try?
lubtry!
) i typ (z odlewuAny
). Dlatego możesz rozwiązać problem, korzystając z jednego z następujących wzorców.# 1. Użycie metody, która zgłasza i zwraca typ nieopcjonalny
Stosowanie:
# 2. Użycie metody, która zgłasza i zwraca opcjonalny typ
Stosowanie:
# 3. Korzystanie z metody, która nie zgłasza i zwraca typ nieopcjonalny
Stosowanie:
# 4. Użycie metody, która nie zgłasza i zwraca opcjonalny typ
Stosowanie:
źródło
Szybki 4
źródło
Szybki 5
źródło
Znalazłem kod, który konwertuje ciąg json na NSDictionary lub NSArray. Po prostu dodaj rozszerzenie.
SWIFT 3.0
JAK UŻYWAĆ
ROZBUDOWA
}
źródło
NSMutable...
typów kolekcji w Swift. Rzutowanie typu naNSMutable...
nigdy nie spowoduje zmiany obiektu. A nieokreślony typ w Swift 3+Any
nie jestAnyObject
.Detale
Rozwiązanie
Stosowanie
Próbka badana
Dziennik testów
źródło
dla swift 5 piszę demo, aby to zweryfikować.
źródło
źródło