2014-05-02 12 views
7

ciao,Errore JSON: "NSDebugDescription Garbage alla fine" (iOS)

Anche se ho fatto ricerche, ho trovato niente che mi può aiutare nella mia situazione.

Quindi, provo ad analizzare Json creato da uno script php su xcode ma ho un errore che blocca il processo.

Sono nuovo così ho triedto fare il meglio per il layout della mia domanda ...

mio errore:

[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. 

Il mio codice:

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

mio JSON:

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

spero che mi aiuterà, grazie per le vostre risposte.

+1

Se vai su http://jsonlint.com e prova con il tuo URL http://codlobbyz.com/app/service.php, e prova con il tuo URL, dice che il tuo JSON non è conforme. Sembra che il tuo WS stia inviando altri dati (questo è spazzatura). – Larme

+0

hm, quindi quando visito questo URL e incollo il jSON dall'esempio il validatore dice "VALID JSON" ... – thorb65

+0

@thorb, confronta il JSON nella domanda con i dati di risposta da http://codlobbyz.com/app/ service.php – Wain

risposta

12

Lo script PHP sta tornando JSON, ma anche un frammento di codice HTML che lo segue:

[{"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 --> 

Si può vedere questo utilizzando ricciolo dalla riga di comando:

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

O per caricandolo in un browser e visualizzando la fonte.

Se si ha il controllo dello script PHP, rimuovere il codice di analisi. Altrimenti, è possibile utilizzare una espressione regolare per rimuovere la parte non JSON della risposta prima di analizzarla.

EDIT: Per il telecomando non JSON con regex, qualcosa di simile a questo dovrebbe funzionare:

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

Grazie funziona! Ringrazia tutti ! – Jopolaz

+0

In 8 ore pubblicherò il codice finale! (non posso ora perché sono un nuovo utente :)) – Jopolaz

0

Se si guarda sui dati grezzi si trova '0' interno per rimuovere le ho usate in seguito per il ciclo

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]; 
      } 

Questo interromperà tutti i byte '00' dalla fine dei dati.

Problemi correlati