2014-05-02 11 views
7

witam,Błąd Json: „NSDebugDescription śmieci na koniec” (iOS)

Nawet jeśli zrobiłem badania, nic nie znalazłem, kto może mi pomóc w mojej sytuacji.

Tak więc, próbuję parsować Json'a stworzonego przez skrypt php na xcode, ale mam błąd, który blokuje proces.

Jestem nowy więc triedto robić najlepiej na układ moje pytanie ...

Mój błąd:

[376:70b] Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Garbage at end.) UserInfo=0x8bc0f70 {NSDebugDescription=Garbage at end. 

Mój kod:

NSData *jsonSource = [NSData dataWithContentsOfURL: 
          [NSURL URLWithString:@"http://codlobbyz.com/app/service.php"]]; 
    NSError *err; 
    id jsonObjects = [NSJSONSerialization JSONObjectWithData: 
         jsonSource options:NSJSONReadingMutableContainers error:&err]; 
    NSLog(@"%@", err); 

Moje json:

[{"nom":"Call of duty ghost","date":"22 novembre","image":"appicon.png"},{"nom":"Fifa 14","date":"22 novembre","image":"appicon.png"}] 

Mam nadzieję, że mi pomoże, dziękuję za odpowiedzi.

+1

Jeśli przejdziesz na http://jsonlint.com i wypróbujesz adres URL http://codlobbyz.com/app/service.php i spróbujesz użyć adresu URL, oznacza to, że Twój JSON nie jest zgodny. Wydaje się, że twój WS wysyła inne dane (to znaczy śmieci). – Larme

+0

hm, więc kiedy odwiedzę ten adres URL i wkleję json z przykładu walidator wypowiada "VALID JSON" ... – thorb65

+0

@thorb, porównaj JSON w pytaniu z danymi odpowiedzi z http://codlobbyz.com/app/ service.php – Wain

Odpowiedz

12

Skrypt PHP zwraca JSON, ale także fragment kodu HTML, który następuje to:

[{"nom":"Call of duty ghost","date":"22 novembre","image":"appicon.png"},{"nom":"Fifa 14","date":"22 novembre","image":"appicon.png"}] 
<!-- Hosting24 Analytics Code --> 
<script type="text/javascript" src="http://stats.hosting24.com/count.php"></script> 
<!-- End Of Analytics Code --> 

można zobaczyć za pomocą curl z wiersza poleceń:

curl http://codlobbyz.com/app/service.php 

albo przez ładowanie go w przeglądarce i wyświetlanie źródła.

Jeśli masz kontrolę nad skryptem PHP, usuń kod analityczny. W przeciwnym razie możesz użyć wyrażenia regularnego, aby usunąć część odpowiedzi inną niż JSON przed analizą.

EDIT: Do zdalnego non-JSON z regex, coś jak to będzie działać:

NSString *json = @"[{\"nom\":\"Call of duty ghost\",\"date\":\"22 novembre\",\"image\":\"appicon.png\"},{\"nom\":\"Fifa 14\",\"date\":\"22 novembre\",\"image\":\"appicon.png\"}]\n<!-- Hosting24 Analytics Code -->\n<script type=\"text/javascript\" src=\"http://stats.hosting24.com/count.php\"></script>\n<!-- End Of Analytics Code -->"; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\s+<!--.*$" 
                     options:NSRegularExpressionDotMatchesLineSeparators 
                     error:nil]; 
NSTextCheckingResult *result = [regex firstMatchInString:json 
               options:0 
                range:NSMakeRange(0, json.length)]; 
if(result) { 
    NSRange range = [result rangeAtIndex:0]; 
    json = [json stringByReplacingCharactersInRange:range withString:@""]; 
    NSLog(@"json: %@", json); 
} 
+0

Dziękuję za pracę! Dziękuje wszystkim ! – Jopolaz

+0

Za 8 godzin opublikuję ostatni kod! (nie mogę teraz, ponieważ jestem nowym użytkownikiem :)) – Jopolaz

0

Jeśli spojrzeć na surowych danych znajdziesz „0” wewnątrz, aby je usunąć użyłem następujących pętli

NSData *objectData = [jsonStr dataUsingEncoding:NSUTF8StringEncoding]; 
      NSError *error; 
      id json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&error]; 
      if (json == nil) { 
       int index = 0; 
       const char *bytes = [data bytes]; 
       for (int i = (int)data.length-1; i > 0; i--) { 
        unsigned char ch = (unsigned char)bytes[i]; 
        NSLog(@"%02hhx", ch); 
        if (ch != 0) { 
         index = i+1; 
         break; 
        } 
       } 

       NSRange dataRange = NSMakeRange(0, index); 
       json = [NSJSONSerialization JSONObjectWithData:[objectData subdataWithRange:dataRange] options:NSJSONReadingMutableContainers error:&error]; 
      } 

Spowoduje to odcięcie wszystkich "00" bajtów od końca danych.

Powiązane problemy