2013-02-16 7 views
12

state cercando di eseguire il debug di un incidente per il passato 10 ore e, infine, ho semplificato a questo codice:NSJSONSistema di serializzazione?

NSError *error = nil; 
NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"payload" ofType:@"txt"]]; 
id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error]; 

Con NSZombieEnabled, questo si blocca l'applicazione alla terza linea (dove il parsing accade) e si registra :

*** -[CFString retain]: message sent to deallocated instance 0x758afa0 

Il contenuto di payload.txt sono:

[ 
    { 
     "created_at":"2013-02-15T23:46:02-05:00", 
     "description":"Take out the Big Gun sounded simple enough, except the Strogg were waiting. You, and a few marines like you, are the lucky ones. You've made it down in one piece and are still able to contact the fleet. The Gravity Well, the Strogg's newest weapon in its arsenal against mankind, is operational. With the fleet around Stroggos, 5% of ground forces surviving, and that number dwindling by the second, your orders have changed: free your comrades. Destroy the Gravity Well.Minimum: A 100% Windows XP/Vista-compatible computer system", 
     "developer":"id Software", 
     "external_id":"2340", 
     "id":745, 
     "image":"http://cdn.steampowered.com/v/gfx/apps/2340/header_292x136.jpg", 
     "is_subscribed":0, 
     "link":"http://store.steampowered.com/app/2340/", 
     "price":"4.99", 
     "seller_id":2, 
     "thumb":"http://media.steampowered.com/steamcommunity/public/images/apps/2340/5bd6e22ffdf72fdfb5ce2092fa50150de5fbb56f.jpg", 
     "title":"Quake II: Ground Zero", 
     "updated_at":"2013-02-15T23:46:02-05:00", 
     "is_subscribed":0 
    }, 
    { 
     "created_at":"2013-02-15T23:45:59-05:00", 
     "description":"Rage through 32 single player levels and 6 deathmatch levels of sheer terror and fully immersive sound and lighting. Arm yourself against the cannibalistic Ogre, fiendish Vore and indestructible Schambler using lethal nails, fierce Thunderbolts and abominable Rocket and Grenade Launchers.Minimum: A 100% Windows XP/Vista-compatible computer system", 
     "developer":"id Software", 
     "external_id":"2310", 
     "id":742, 
     "image":"http://cdn.steampowered.com/v/gfx/apps/2310/header_292x136.jpg", 
     "is_subscribed":0, 
     "link":"http://store.steampowered.com/app/2310/", 
     "price":"9.99", 
     "seller_id":2, 
     "thumb":"http://media.steampowered.com/steamcommunity/public/images/apps/2310/e5bdf8dc7759c573fe525d45b69011f6a173a984.jpg", 
     "title":"Quake", 
     "updated_at":"2013-02-15T23:45:59-05:00", 
     "is_subscribed":0 
    } 
] 

E 'solo una serie di 2 dizionari. Non sono sicuro di cosa stia causando questo arresto anomalo/cosa c'è che non va in questo JSON.

UPDATE La rimozione di "is_subscribed":0 nel primo oggetto dell'array elimina l'arresto anomalo.

+0

Se provate a usare la libreria SBJSON che questo è facile. – Dilip

+1

@Dilip Non voglio usare SBJSON. Voglio sapere perché NSJSONSerialization si blocca e/o cosa c'è di sbagliato nel mio JSON. – 0xSina

+5

@Dilip Non dare cattivi consigli, per favore. –

risposta

3

Sembra che Apple abbia svolto un brutto lavoro nella gestione degli errori di tali casi all'interno della classe, dal momento che si è arrestato in modo anomalo invece del normale risultato nullo e della variabile di errore popolata. I tuoi dati JSON e il codice minimalista sono ciò che Apple di solito richiede per una corretta segnalazione di bug. Segnala il bug seguendo il link - https://developer.apple.com/bugreporter/ non dimenticare di allegare il progetto in zip come prova che si blocca.

+0

Puoi chiarire quale è la logica dietro questo vars duplicato? Non sei sicuro di come hai pianificato di elaborarli. –

+0

Il problema non è semplicemente una chiave duplicata, ma piuttosto una chiave di stringa "is_subscribed". Infatti, se si scambia l'ordine con i due dizionari nell'array principale, non si blocca più ... quindi è più che solo chiavi duplicate. Leggi la discussione nel post principale per ulteriori informazioni. '[{" chiave ": 0," chiave ": 0}]' non causa questo problema. Se leggi la discussione sul post principale, troverai la logica dietro le chiavi duplicate nel dizionario ... è stato un errore da parte mia sul lato server. – 0xSina

+1

Hai ragione. Ho passato la serie di test e sembra che ci sia solo un comportamento strano. Penso che tu abbia una buona causa per la segnalazione di bug. Non è previsto un comportamento, tali classi non dovrebbero bloccarsi in nessuna configurazione. Puoi andare e inviare un rapporto seguendo il link - https://developer.apple.com/bugreporter/ –

1

Avevo questo problema e per me il problema era una chiave duplicata nel JSON. La mia chiave è stata nominata diversamente - non "is_subscribed" come nel tuo caso, ma "food_nutrients". Sono disposto a scommettere che iOS 6 si blocca su eventuali chiavi duplicate in cui vi è un'altra chiave in mezzo - non solo una chiave "is_subscribed" come suggeriscono alcuni dei commenti.

Ho confermato che le chiavi duplicate di qualsiasi nome sono il problema. Relativo: https://stackoverflow.com/a/21148319/2030

Problemi correlati