web-dev-qa-db-fra.com

Comment valider JSON avec Jackson JSON

J'essaie d'utiliser Jackson JSON. Prenez une chaîne et déterminez si c'est un JSON valide. Quelqu'un peut-il suggérer un exemple de code à utiliser (Java)?

27
NinjaCat

Vous ne savez pas quel est votre cas d'utilisation, mais vous devriez le faire:

public boolean isValidJSON(final String json) {
   boolean valid = false;
   try {
      final JsonParser parser = new ObjectMapper().getJsonFactory()
            .createJsonParser(json);
      while (parser.nextToken() != null) {
      }
      valid = true;
   } catch (JsonParseException jpe) {
      jpe.printStackTrace();
   } catch (IOException ioe) {
      ioe.printStackTrace();
   }

   return valid;
}
31
Perception

Bien que la réponse de Perception réponde probablement à de nombreux besoins, il y a des problèmes qu'elle ne comprend pas, notamment les clés en double. Prenez l'exemple suivant:

String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }";

En complément, vous pouvez rechercher les doublons avec le code suivant:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
objectMapper.readTree(json);

Il jette JsonProcessingException sur une clé en double ou une autre erreur.

17
holmis83

Je recommanderais d'utiliser API de validation de bean séparément: c'est-à-dire, lier d'abord les données à un POJO, puis valider le POJO. Niveau de format de données À mon avis, les schémas ne sont pas très utiles: il faut généralement encore valider les problèmes de niveau supérieur, et les langages de schéma eux-mêmes sont maladroits, en particulier. ceux qui utilisent le format en cours de validation (XML Schema et JSON Schema ont tous deux cette faille fondamentale) . Cela rend le code plus modulaire, réutilisable et sépare les problèmes (sérialisation, validation des données).

Mais je voudrais en fait aller un peu plus loin et vous suggérer de jeter un coup d'œil à DropWizard - il intègre l'implémentation de Jackson et de l'API de validation (du projet Hibernate).

11
StaxMan

Avec Jackson j'utilise cette fonction:

public static boolean isValidJSON(final String json) throws IOException {
    boolean valid = true;
    try{ 
        objectMapper.readTree(json);
    } catch(JsonProcessingException e){
        valid = false;
    }
    return valid;
}
11
madx

Une autre option serait d'utiliser Java.util.Optional dans Java 8. Cela permet de retourner un objet et d'utiliser dans le code appelant une approche plus fonctionnelle.

Ceci est une autre implémentation possible:

public Optional<JsonProcessingException> validateJson(final String json) {
    try{ 
        objectMapper.readTree(json);
        return Optional.empty();
    } catch(JsonProcessingException e){
        return Optional.of(e);
    } catch(IOException e) {
        throw new RuntimeException(e);
    }
}

Ensuite, vous pouvez utiliser cette méthode comme ceci:

jsonHelper.validateJson(mappingData.getMetadataJson())
                    .map(e -> String.format("Error: %s at %s", e.getMessage(), e.getLocation().toString()))
                    .orElse("Valid JSON");
2
gil.fernandes

Améliorer les autres réponses

public static boolean isValidJSON(final String json) throws IOException {
    boolean valid = true;
    try{ 
        mapper.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);
        mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
        objectMapper.readTree(json);
    } catch(JsonProcessingException e){
        valid = false;
    }
    return valid;
}
0
mc20