laissez Gson lancer des exceptions sur les mauvais types

- Je utiliser Gson à l'intérieur de mes projets pour désérialiser JSON-Chaînes de caractères en Java-Objets. Si je fais une demande, j'attends de bien définir la réponse du Serveur. Le Serveur renvoie le bien-défini la réponse que j'attends, OU il sera de retour moi une (également défini) Objet error.

À mettre les choses au clair: supposons que j'ai un Objet simple comme ceci:

class Dummy{
   private String foo;
   private int bar;
}

et un Objet d'Erreur comme ceci:

class ErrorHolder{
   private RequestError error;
}

class RequestError{
    private String publicMsg;
    private String msg;
}

Si je reçois un Serveur-réponse, comme

{"foo":"Hello World", "bar":3 }

tout fonctionne comme prévu.

Mais si la réponse est comme ça

{"error":{"publicMsg":"Something bad happened", msg:"you forgot requesting some parameter"}}

Je vais obtenir une sorte de Dummy objet où foo est null et bar est à 0! Le Gson documentation (fromJson) stipule clairement que:

jette
JsonSyntaxException - si json n'est pas une représentation valable pour une
objet de type classOfT

donc je m'attendais à obtenir une JsonSyntaxException si j'essaie d'analyser la deuxième réponse comme ceci:

Dummy dummy = Gson.fromJson(secondResponse, Dummy.class);

parce que le Json ne représente pas un objet fictif, mais un ErrorHolder Objet.

Donc ma question est: Est-il un moyen, qui Gson détecte un mauvais type en quelque sorte, et me jette une Exception?

Court de l'utilisation de JSON Schema, pourquoi ne pas vous inspectez votre JSON entrée en premier afin de vérifier s'il est valide (c'est à dire, a les membres valides)?
Gson est explicitement conçu pour tourner une chaîne JSON en type, pas dynamiquement deviner de quel type que vous voulez dire. La structure de l'objet que vous utilisez doit refléter les données que vous attendez pour analyser, donc si error est un domaine que vous pourriez recevoir, il devrait être un champ de la classe.
Est-il une alternative parser json, ce qui lui donne intégré dans la facilité?
Regarder la mise à jour de la accepté de Répondre. Le AnnonatedSerializer devrait faire le travail, plus vous avez un contrôle précis sur les champs où ce comportement prend place

OriginalL'auteur Rafael T | 2013-01-09