2012-04-19 1 views
22

J'essaie d'utiliser Jackson JSON prendre une chaîne et déterminer si elle est JSON valide. Quelqu'un peut-il suggérer un échantillon de code à utiliser (Java)?Comment valider JSON avec Jackson JSON

+1

Comment DeFina que JSON est valide? – Slavus

+1

@Slavus: Toute chaîne répondant à la norme de syntaxe JSON est un JSON valide. Nous ne définissons pas un JSON valide. – Vivek

+0

J'ai des années de retard et cela peut ne pas avoir été disponible en 2012, mais pensez-vous à [schéma JSON] (http://json-schema.org/)? – Stroboskop

Répondre

27

Je ne sais pas ce que votre cas d'utilisation en est, mais cela devrait 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; 
} 
+3

getJsonFactory() est obsolète. – Arash

+0

Une solution courte et élégante est disponible ici [Merci à @pdem] (http://stackoverflow.com/a/29414638/452708) 'try { ObjectMapper objectMapper = ...; JsonNode jsonNode = objectMapper.readTree (yourJsonString); } catch (JsonProcessingException e) {.......}} – Abhijeet

+1

les deux méthodes sont dépréciées: getJsonFactory(). CreateJsonParser (json). Utilisez istead: getFactory(). CreateParser (json) – kiedysktos

10

Je recommanderais d'utiliser Bean Validation API séparément: qui est, les premières données de se lier à un POJO, puis validez POJO. Niveau de format des données Les schémas ne sont pas très utiles à mon avis: il faut généralement toujours valider les problèmes de niveau supérieur, et les langages de schémas 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 de base). Cela rend le code plus modulaire, réutilisable et sépare les problèmes (sérialisation, validation des données).

Mais je voudrais aller un peu plus loin, et je vous suggère de regarder DropWizard - il intègre l'implémentation de l'API Jackson et Validation API (du projet Hibernate).

+0

Dropwizard semble s'être déplacé vers une nouvelle maison (www.dropwizard.io) et s'appelle maintenant "un framework Java pour le développement de web RESTful, facile à utiliser et performant prestations de service".Je n'ai pas lu mais il est possible qu'il intègre encore Jackson et API de validation. Je ne sais pas si vous avez besoin de tout le reste. – Wivani

+0

Oui, DropWizard intègre toujours l'API Jackson et Validation dès maintenant (février 2016). Je ne vois pas ces changements pour le projet, il est assez mature à ce stade. Vous pouvez bien sûr utiliser d'autres bibliothèques de liaison (JAX-RS est fortement connectable), mais en tant que ligne de base, ces 2 bibliothèques resteront probablement. – StaxMan

12

Bien que la réponse de la perception probablement adapté à de nombreux besoins, il y a des problèmes, il ne sera pas attraper, l'un d'eux est un double des clés, considérons l'exemple suivant:

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

En complément, vous pouvez vérifier dupliquer les clés avec le code suivant:

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

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

7

Avec Jackson-je utiliser 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; 
} 
1

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

Ceci est une autre application 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");