2014-05-09 6 views
0

Je reçois un type de réponse JSON différent de l'API de requête HTTP. Il peut y avoir deux options de format JSON qui reviennent de l'API. Par exemple, il peut s'agir d'une réponse valide avec des données attendues, mais dans certains cas, il peut s'agir d'un message interne d'erreur de serveur.Traitement Java JSON

En ce moment j'utilise Gson pour convertir la chaîne entrante en objet, mais puisque parfois il vient comme format différent Gson pas capable de le convertir en tant que modèle différent de classe est fourni. REMARQUE: Erreur ne signifie pas une exception. Par exemple, le corps JSON contient uniquement des informations indiquant que l'authentification a échoué par exemple, mais l'appel a été effectué avec succès et le corps JSON est VALIDE. HTTP est en fait toujours réussi et sera 200. Le problème est que parfois l'authentification peut échouer et il retournera JSON différent.

String response = restTemplate.getForObject(request, String.class); 
ObjectResponse objResponse = gson.fromJson(response, ObjectResponse.class); 

Pourriez-vous suggérer une meilleure façon de le faire afin que je puisse gérer différents types de réponses? Ou peut-être que vous connaissez une façon complètement différente de le faire.

Merci!

+1

Notez que les en-têtes HTTP ont un code d'état. Vous pouvez vouloir utiliser cela (200 = OK, 404 = non trouvé, 500 = erreur de serveur interne, etc.) – enlait

+0

Eh bien, vous pouvez toujours faire comme la plupart du monde non Java - analyser dans Maps et Lists, puis examinez l'arbre résultant. Si vous avez besoin de créer un objet, écrivez un constructeur qui accepte une carte - le flux est vraiment naturel. –

Répondre

1

Si vous ne pouvez pas prédire la structure de la réponse, le mapper à un arbre de simples cartes, tableaux et chaînes Java. La bibliothèque Jackson supporte cela avec les méthodes 'readTree'. Une fois que vous avez regardé l'arbre et décidé de ce que c'est, vous pouvez alors demander à la bibliothèque de mapper un arbre à un objet d'une classe.

+0

Merci! Probablement c'est le plus approprié pour moi en ce moment! –

1

Une option consiste à créer une classe représentant les données JSON et à les désérialiser. De cette façon, si les données ne correspondent pas à cette structure, vous obtiendrez une exception. Lorsque vous essayez de créer votre objet et qu'il échoue, attrapez l'exception et tentez de la décoder comme une erreur - vous pouvez alors gérer cette casse comme vous le souhaitez (et le cas potentiel où ce n'est pas l'objet auquel vous vous attendez). ou une erreur valide).

+0

Erreur ne signifie pas une exception. Par exemple, le corps JSON contient uniquement des informations indiquant que l'authentification a échoué par exemple, mais l'appel a été effectué avec succès et le corps JSON est VALIDE. –

+0

@WildGoat En effet, j'ai mal lu votre message et je pensais que vous étiez en train de sérialiser/désérialiser vos classes en JSON - donc essayer de désérialiser JSON qui ne correspondait pas à votre classe provoquerait une exception. Je vais mettre à jour ma réponse. –

-1

Vérifiez les codes de réponse HTTP. Si vous recevez un code d'état qui n'est pas OK (200), vous ne devez pas essayer d'analyser une réponse réussie. Par exemple, vous pouvez vérifier le code et gérer la réponse comme ceci (les types d'objets ne sont pas les types Java réels, mais sont donnés pour donner un exemple):

MyHttpResponse response = MyHttpHelper.execute(...); 
int status = response.getMyStatusCode(); 
String responseData = response.getStringBody(); 
switch(status) { 
    case 200: { 
     //request is successful, parse valid data 
     break; 
    } 
    default: { 
     //request is not valid, parse error data 
     break; 
    } 
} 
+0

Merci pour votre réponse, mais HTTP est en fait toujours réussi et sera de 200. Le problème est que parfois l'authentification peut échouer et il retournera JSON différent. –

+0

trop mauvais. le code d'état ne devrait pas toujours être 200! – binnyb