2012-03-29 3 views
3

Existe-t-il un moyen avec NSJSONSerialization de vérifier que le NSData est valide JSON? Je ne veux pas que l'application expire si l'API renvoie un JSON non valide pour une raison quelconque.Vérifier si la réponse de l'API est valide JSON

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
NSError *error; 
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 

Répondre

26

Cela ne va pas "erreur", il retournera juste nil si le JSON n'est pas valide. Ainsi, le test pour voir si elle est valide JSON serait:

NSError *error; 
if ([NSJSONSerialization JSONObjectWithData:data 
            options:kNilOptions 
             error:&error] == nil) 
{ 
    // Handle error 
} 

Si elle ne retourne nil alors vous pouvez vérifier error pour voir ce qui a mal tourné.

+0

Pouvez-vous s'il vous plaît fournir un exemple de code montrant comment attraper l'erreur avec le code d'erreur? –

0

Il n'y a pas vraiment moyen de vérifier les données sans créer l'objet avec NSJSONSerialization; Je voudrais le mettre dans un essai-catch. Si vous vous retrouvez dans le bloc catch, ce n'est pas JSON valide.

EDIT: En y repensant, si une erreur survient, 'error' est un objet d'erreur. Donc, même si rien n'est lancé, vous pouvez vérifier cela pour voir si les données étaient valides.

7

NSJSONSerialization classe ont une méthode pour faire exactement cela ... (EDIT: Non, ce ne ...)

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
BOOL isValid = [NSJSONSerialization isValidJSONObject:jsonObj]; 

EDIT: (Après le commentaire de hypercrypts)

Hypercrypt est juste (je ne peux vraiment pas comprendre comment j'ai raté cela) ... Même si ma réponse semble fonctionner, c'est tort. Ce que fait la méthode isValidJSONObject: est de vérifier si un objet peut être sérialisé en JSON et non l'inverse. Donc, sa réponse est ce que vous cherchez. Vous pouvez utiliser cette méthode dans le cas où vous récupérez une copie mutable à partir d'une charge utile json, la muter et plus tard, vous voulez vérifier s'il est prudent d'essayer de la ré-sérialiser en une chaîne JSON. Mais la conclusion est que la réponse d'hypercrypt est la bonne et je pense qu'il serait plus que juste de marquer sa réponse comme correcte au lieu de la mienne. De toute façon, désolé pour toute confusion et merci @hypercrypt pour le signaler :)

+2

Ce n'est pas ce que '- [NSJSONSerialization isValidJSONObject:]' est pour. Il s'agit de vérifier qu'un tableau arbitraire ou un dictionnaire est valide pour être transformé en une chaîne JSON. – hypercrypt

+0

@hypercrypt merci de souligner cela, vérifiez ma réponse éditée ... – Alladinian

+0

Merci @hypercrypt - La documentation sur ce n'est pas très bon. Je pensais que je devenais fou. – ferdil

Questions connexes