2012-04-19 61 views
22

Estoy tratando de utilizar Jackson JSON tomar una cadena y determinar si es JSON válida. ¿Alguien puede sugerir una muestra de código para usar (Java)?Cómo validar JSON con Jackson JSON

+1

¿Cómo DeFina que JSON es válida? – Slavus

+1

@Slavus: Cualquier cadena que satisfaga el estándar de sintaxis JSON es un JSON válido. No definimos un JSON válido. – Vivek

+0

Llegué tarde y es posible que no haya estado disponible en 2012, pero ¿está pensando en [esquema JSON] (http://json-schema.org/)? – Stroboskop

Respuesta

27

No estoy seguro que su caso de uso para esto es, pero esto debe hacerlo:

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á en desuso. – Arash

+0

Solución corta y elegante está disponible aquí [Gracias a @pdem] (http://stackoverflow.com/a/29414638/452708) 'try { ObjectMapper objectMapper = ...; JsonNode jsonNode = objectMapper.readTree (yourJsonString); } catch (JsonProcessingException e) {........} ' – Abhijeet

+1

ambos métodos se han depreciado: getJsonFactory(). CreateJsonParser (json). Use this istead: getFactory(). CreateParser (json) – kiedysktos

10

Yo recomiendo usar Bean Validation API por separado: es decir, los primeros datos se unen a un POJO, a continuación, validar POJO. Nivel de formato de datos En mi opinión, los esquemas no son muy útiles: uno generalmente todavía tiene que validar las inquietudes de mayor nivel, y los propios lenguajes de esquema son torpes, especialmente. los que usan el formato que se valida (el Esquema XML y el Esquema JSON tienen este defecto básico). Al hacer esto, el código es más modular, reutilizable y separa las preocupaciones (serialización, validación de datos).

Pero en realidad iría un paso más allá, y sugiero que eche un vistazo a DropWizard - integra la implementación de Jackson y la API de validación (del proyecto Hibernate).

+0

Dropwizard parece haberse trasladado a un nuevo hogar (www.dropwizard.io) y se llama a sí mismo ahora "un marco de Java para desarrollar una web RESTful amigable, de alto rendimiento y de alto rendimiento servicios".No he leído, pero posiblemente todavía integra Jackson y la API de validación. No estoy seguro de si necesitas todo el resto. – Wivani

+0

Sí, DropWizard aún integra Jackson y la API de validación a partir de ahora (feb 2016). No veo esos cambios para el proyecto, es bastante maduro en este momento. Por supuesto, puede utilizar otras bibliotecas de enlace (JAX-RS es altamente conectable), pero como línea de base esas 2 bibliotecas probablemente se mantendrán. – StaxMan

12

Aunque la respuesta de Percepción probablemente encajará muchas necesidades, hay algunos problemas que no cogerá, uno de ellos es duplicados de las llaves, consideremos el siguiente ejemplo:

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

Como complemento, se puede comprobar si hay duplicar llaves con el siguiente código:

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

Se lanza JsonProcessingException el duplicado de la llave u otro error.

7

Con Jackson puedo utilizar esta función:

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

Otra opción sería utilizar java.util.Optional en Java 8. Esto permite devolver un objeto y para usar en el código de llamada un enfoque más funcional.

Ésta es otra aplicación posible:

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); 
    } 
} 

continuación, puede utilizar este método como este:

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