W mojej aplikacji na iOS 5 mam NSString
ciąg znaków JSON. Chciałbym zdeserializować tę reprezentację ciągu JSON na NSDictionary
obiekt natywny .
"{\"password\" : \"1234\", \"user\" : \"andreas\"}"
Wypróbowałem następujące podejście:
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:@"{\"2\":\"3\"}"
options:NSJSONReadingMutableContainers
error:&e];
Ale zgłasza błąd czasu wykonania. Co ja robię źle?
-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSCFConstantString bytes]: unrecognized selector sent to instance 0x1372c'
Odpowiedzi:
Wygląda na to, że przekazujesz
NSString
parametr, do którego należy przekazywaćNSData
parametr:źródło
nil
jako błędu zamiast&e
w XCode 5Na przykład masz znak
NSString
ze znakami specjalnymi wNSString
strChangetoJSON. Następnie możesz przekonwertować ten ciąg na odpowiedź JSON przy użyciu powyższego kodu.źródło
Utworzyłem kategorię z odpowiedzi @Abizern
Użyj tego w ten sposób,
źródło
error
w takich przypadkach, ale zamiast tego sprawdzenie, czy wartość zwracana jest równa zero, czy nie przed zwróceniem. tj.return json ?: nil;
Drobne szczypanie, ale myślę, że warto o tym wspomnieć.nil
od razu wracamy .W Swift 3 i Swift 4
String
ma metodę o nazwiedata(using:allowLossyConversion:)
.data(using:allowLossyConversion:)
posiada następującą deklarację:W Swift 4,
String
'sdata(using:allowLossyConversion:)
można używać w połączeniu zJSONDecoder
' sdecode(_:from:)
w celu deserializacji ciągu JSON do słownika.Ponadto szybkimi 3 i Swift 4
String
„ydata(using:allowLossyConversion:)
mogą być również stosowane w połączeniu zJSONSerialization
” SjsonObject(with:options:)
w celu Cofnięcie ciąg JSON w słowniku.# 1. Rozwiązanie Swift 4
W Swift 4
JSONDecoder
ma metodę o nazwiedecode(_:from:)
.decode(_:from:)
posiada następującą deklarację:Poniższy kod Playground pokazuje, jak używać
data(using:allowLossyConversion:)
idecode(_:from:)
jak uzyskać aDictionary
z formatu JSONString
:# 2. Rozwiązanie Swift 3 i Swift 4
W Swift 3 i Swift 4
JSONSerialization
ma metodę o nazwiejsonObject(with:options:)
.jsonObject(with:options:)
posiada następującą deklarację:Poniższy kod Playground pokazuje, jak używać
data(using:allowLossyConversion:)
ijsonObject(with:options:)
jak uzyskać aDictionary
z formatu JSONString
:źródło
Używanie kodu Abizern dla Swift 2.2
źródło